Due utenti che inseriscono dati contemporaneamente

venerdì 14 febbraio 2014 - 18.48

fritzer Profilo | Junior Member

Salve sto sviluppando una applicazione in vb2005 che si collega a un db sqlserverexpress 2005 e ho il seguente problema: se i due utenti cercano di inserire i dati contemporaneamente nella tabella del tipo
id:autoincrement
nome:text
Cognome:text
capita che l'applicazione non rispetta l'ordine incrementale del campo id.
esempio: se il primo utente clicca sul pulsante nuovo vedo nel form il valore id=1
allo stesso tempo se il secondo utente anche lui clicca sul pulsante nuovo , nel form il valore id è sempe =1

come posso risolvere?
francesco carnevale

renarig Profilo | Expert

>esempio: se il primo utente clicca sul pulsante nuovo vedo nel
>form il valore id=1
>allo stesso tempo se il secondo utente anche lui clicca sul pulsante
>nuovo , nel form il valore id è sempe =1

Certamente sto per dire una scemata, l'autoincrement viene gestito autonomamente dal DB
pertanto ti basta nelle form ignorarlo completamente ( non metterlo neanche nel set di dati )

al momento dell'INSERT il DB si mette direttamente nella sua tabella il valore appropriato.



alx_81 Profilo | Guru

>Salve
ciao

>capita che l'applicazione non rispetta l'ordine incrementale del campo id.
>esempio: se il primo utente clicca sul pulsante nuovo vedo nel form il valore id=1
>allo stesso tempo se il secondo utente anche lui clicca sul pulsante nuovo , nel form il valore id è sempe =1
>come posso risolvere?
quello che dici non basta purtroppo ad esserti di aiuto, perché non sappiamo le seguenti cose:
- non conosciamo come l'applicazione faccia l'insert (potrebbe controllare una chiave diversa dall'identità prima di inserire, col risultato che l'effettivo ed unico id inserito per un non meglio definito duplicato sia 1).
- non sappiamo come i dati vengano letti nella form di cui parli (vengono effettivamente riletti? Se sì, magari la query per sicurezza ti torna solo il TOP 1 fra tutti i record, ed ecco che vedrai sempre 1)

cerchiamo di capire prima cosa fa l'applicazione, sia in inserimento, sia in lettura. Ti chiedo più dettagli, altrimenti la risposta rischia di essere troppo aleatoria.

per quanto riguarda renarig:
>l'autoincrement viene gestito autonomamente dal DB
è vero, non è una scemata, l'identità è fatta proprio come utilità di autoincremento gestito in autonomia dal DB.

>pertanto ti basta nelle form ignorarlo completamente ( non metterlo neanche nel set di dati )
diciamo che non è sempre così, e che comunque, se non metti gli opportuni constraint, rischi di avere tanti record n-uplicati, soprattutto se fai la chiave primaria su quell'identità. Diciamo che non basta, e che farei altre considerazioni (diciamo quelle messe sopra )

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

> diciamo che non è sempre così, e che comunque, se non metti gli opportuni constraint, rischi di avere tanti record n-uplicati, soprattutto se fai la chiave primaria su quell'identità. Diciamo che non basta, e che farei altre considerazioni (diciamo quelle messe sopra )

Ciao Alex, scusa forse mi manca qualche nozione tecnica ma non ho ben capito cosa intendi con questa frase.
Io di solito imposto la tabella con ID che si autoincrementa e spesso il campo id è anche chiave primaria, però non mi sono mai preoccupato delle operazioni concorrenziali, non le gestisce in autonomia il db?
cosa intendi con "se non metti gli opportuni constraint" ?

grazie

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>Io di solito imposto la tabella con ID che si autoincrementa
>e spesso il campo id è anche chiave primaria, però non mi sono
>mai preoccupato delle operazioni concorrenziali, non le gestisce
>in autonomia il db?
>cosa intendi con "se non metti gli opportuni constraint" ?
Forse hai ragione, sono stato superficiale e ho dato per scontato qualche dettaglio in più.
Cerco di spiegarmi meglio con un esempio.. Immagina di avere una tabella che è data da:

ID numerico autoincrementante Primary Key
Nome stringa
Cognome stringa
Altri campi...

Ok, la primary key mi dà l'univocità del record.. Ma se due utenti aprono la stessa form di inserimento del record di cui sopra nello stesso momento, possono potenzialmente immettere lo stesso valore in Nome e Cognome, che (ipoteticamente) potresti volere invece come univoci. Due utenti infatti potrebbero cercare di inserire "Alessandro" e "Alpi" nei due campi, ignorando l'id, gestito in automatico dal motore del database. Ecco in questo caso, due inserimenti che partono riempiono la tabella come segue:

1 Alessandro Alpi
2 Alessandro Alpi

Come puoi ben immaginare, questa casistica, non voluta, potrebbe essere gestita creando un constraint univoco sui campi nome e cognome. In questo modo, il secondo inserimento in ordine di tempo viene schermato da un controllo direttamente a database. Con esso mantieni la consistenza e la pulizia dei dati.
Molto spesso capita di vedere ID interi autoincrementanti messi come PK, anche se la tabella ha in realtà una chiave naturale (magari composta) che darebbe in egual modo l'univocità al record. Ma per tanti motivi (tra cui semplicità nelle join, nella scrittura del codice, nell'indicazione posizionale del record) l'id è comodo ed il suo utilizzo è pure consigliato. Resta il fatto che se esiste una chiave naturale nella tabella, è buona norma fare il constraint di univocità, per proteggere la consistenza dei dati.
Spero sia più chiaro ora
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

fritzer Profilo | Junior Member

Ok Ragazzi ho risolto...
Ho fatto in questo modo
il problema è il seguente. con VB quando si clicca sul punsante nuovo record non fa altro che abilitare il form in scrittura recuperando dal dataset l'ultimo id presente e incrementandolo, però il problema sussiste se nello stesso tempo più utenti hanno fatto altri inserimenti. Allora ho risolto cosi : ho creato un mio pulsante nuovo record che all'evento click mi effettua un insert in tabella aggiornando i campi con prenotarecord=1 NomeUtente="nomeutente" allo stesso tempo mi faccio restituire l'ID del record che è stato appena prenotato. poi completo tutti i dati del form ed effettuo il salvataggio, successivamente imposto il campo recordprenotato corrispondente all'ID al valore 0.
Grazie ancora ragazzi...
francesco carnevale
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5