Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
Campo calcolato,gestione della concorrenza....
domenica 31 gennaio 2010 - 14.35
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
enricovirg
Profilo
| Newbie
36
messaggi | Data Invio:
dom 31 gen 2010 - 14:35
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
1.527
messaggi | Data Invio:
dom 31 gen 2010 - 14:41
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
36
messaggi | Data Invio:
lun 1 feb 2010 - 12:39
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
1.527
messaggi | Data Invio:
lun 1 feb 2010 - 19:26
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
36
messaggi | Data Invio:
lun 1 feb 2010 - 19:59
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.
Torna su
Stanze Forum
Elenco Threads
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 !