Campo calcolato,gestione della concorrenza....

domenica 31 gennaio 2010 - 14.35

enricovirg Profilo | Newbie

Ho un applicativo vb.net che come database usa sql server express 2005.
Su alcune tabelle utilizzo come chiave primaria un campo varchar, il cui valore viene calcolato da una funzione che:
1) Faccio una SELECT su una tabella [Numeratori] per prendermi il valore int [Numero]
2) Poi aggiorno la tabella [Numeratori] con UPDATE di [Numero] = [Numero] + 1
Tale funzione è scritta lato "intefaccia" in vb.net, utilizzando un oggetto SqlClient.Command

MI è capitato però che alcune volte più utenti abbiano ricevuto la stesso numero e quindi non siano riusciti a salvare nelle tabelle per errore di chiave primaria duplicata....
Questo è sicuramente capitato perchè più utenti sono arrivati alla SELECT quando il campo [Numero] non era stato ancora aggiornato...

Come posso fare evitare questo tipo di errore ?
Se scrivo la funzione come StoredProcedure e la metto in una Transazione risolvo ?




Jeremy Profilo | Guru

Ciao.
Forse sarebbe più semplice gestire l'eccezione e ripetere l'operazione..... ma perchè mai dovresti calcolare tu il valore di un campo a chiave primaria se è di tipo Intero?

Facci sapere...
Ciao

enricovirg Profilo | Newbie

Lo calcolo io il campo poichè è legato a dei parametri:
Codice Azienda
Anno Contabile
Numero progressivo

quindi mi esce una chiave primaria del tipo
01|2009|000987
(progressivo tipo numero fattura per intenderci, dove ad ogni anno si azzera...)

altrimenti avrei usato un campo int autoincrementante...

Jeremy Profilo | Guru

Ok.
allora, come ti dicevo, gestisci l'eccezione ... in caso di errore puoi decidere se
1) autoincrementare di 1 il numero progressivo
2) Avvisare l'utente che si verificata un eccezione e chiedere di riprovare.


Facci sapere....
Ciao

enricovirg Profilo | Newbie

non mi pare una gran soluzione... se i programmi gestisserò in questo modo la multiutenza, sarebbe un pò un problema !
Cmq gestirò la problematica isolando le transazioni e attuando un blocco a livello di riga...
SELECT * FROM Tabella WITH(ROWLOCK) WHERE.....

Grazie a tutti lo stesso.





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