Problema chiave duplicata in tabella

lunedì 04 giugno 2012 - 23.58
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server 2008 R2

1111matteo1111 Profilo | Newbie

Ciao a tutti
(non so se devo postare qui o in vb.net)

in vb.net e sql 2008 r2 sto realizzando un programma per caricamento ordini
la tabella principale è composta da i seguenti campi:

Anno INTEGER
Tipo INTEGER
Numero INTEGER
ecc..
ecc.
ecc.

I primi tre campi rappresentano anche la chiave primaria

Vorrei provare come si comporta il programma in multiutenza

Diciamo che così scrivo il progressivo del nuovo ordine
StringaTot="INSERT INTO ProvaTab (Anno,Tipo,Numero) SELECT 2012,1,MAX(Numero) +1 FROM ProvaTab WHERE Anno=2012"

Comando.CommandText = stringaTot
Comando.Connection = dbs
Comando.ExecuteNonQuery()

Fin qui tutto ok. I record vengono creati correttamente

Ma in multiutenza?
Per simulare ho creato vari thread che richiamano la sub sopra ma appena avviamo
mi da errore di chiave duplicata.
Come mai?
Dovrei utilizzare obbligatoriamente un campo incremento per inserire i nuovi record?
Grazie in anticipo

micto27 Profilo | Senior Member

>Per simulare ho creato vari thread che richiamano la sub sopra
>ma appena avviamo
>mi da errore di chiave duplicata.
>Come mai?
>Dovrei utilizzare obbligatoriamente un campo incremento per inserire
>i nuovi record?

Ciao,
succede perchè potrebbe capitare che 2 o più thread acquisiscono con la SELECT lo stesso MAX(Numero)
e quindi solo la prima delle N insert andrebbe a buon fine.

Quindi o utilizzi una colonna ad incremento automatico (identity) oppure devi garantirti che il metodo che esegue
l'operazione sia configurato in modo che possa essere attraversato da un solo Thread per volta.
In VB ad esempio

<MethodImpl(MethodImplOptions.Synchronized)> _
Public Sub miaProcedure()

End Sub

ciao, Michele

1111matteo1111 Profilo | Newbie

Grazie
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5