[SQL SERVER] Info su Transazioni con VB.Net o C#

martedì 24 novembre 2009 - 00.11

gigi90 Profilo | Senior Member

Salve a tutti, non conosco bene come funzionano le transazioni in SQL Server, vi espondo subito il mio problema: utilizzo la libreria ADO.NET per le transazioni in particolare gli oggetti SQLConnection ed SQLTransaction, vi esponso subito il mio problema con questo codice:

Dim conn as new SQLConnection(StringaConnession)
conn.Open()
Dim trans as SqlTransaction= conn.BeginTransaction()
Dim com as New SqlCommand("INSERT INTO Prodotti(ID,Descrizione) VALUES (1,'Prova')",conn,trans)
com.ExecuteNonQuery()
com.CommandText="SELECT MAX(Id)+1 FROM Prodotti"
com.ExecuteScalar()'Qui va in timeout

All'esecuzione dell'ultimo comando l'operazione va in timeout poichè vado ad eseguire una query su una tabella modificata che risulta quindi bloccata ad altre operazioni, a questo punto vorrei sapere come permettere operazioni di scrittura e lettura su una stessa tabella nella stessa transazione.

Grazie a tutti coloro che mi aiuteranno.

P.S.:L'sql è esemplificativo e serve solo ad esporvi il problema.

lbenaglia Profilo | Guru

>Dim conn as new SQLConnection(StringaConnession)
>conn.Open()
>Dim trans as SqlTransaction= conn.BeginTransaction()
>Dim com as New SqlCommand("INSERT INTO Prodotti(ID,Descrizione)
>VALUES (1,'Prova')",conn,trans)
>com.ExecuteNonQuery()
>com.CommandText="SELECT MAX(Id)+1 FROM Prodotti"
>com.ExecuteScalar()'Qui va in timeout
>
>All'esecuzione dell'ultimo comando l'operazione va in timeout
>poichè vado ad eseguire una query su una tabella modificata che
>risulta quindi bloccata ad altre operazioni, a questo punto vorrei
>sapere come permettere operazioni di scrittura e lettura su una
>stessa tabella nella stessa transazione.

Secondo me la cosa migliore da fare è definire una colonna IDENTITY ed incapsulare il comando di INSERT in una stored procedure parametrica che restituisca l'ID autogenerato richiamando la funzione SCOPE_IDENTITY().
In questo modo eviti l'utilizzo delle transazioni minimizzando il lock ed aumentando di conseguenza la scalabilità del DBMS:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=12216

>Grazie a tutti coloro che mi aiuteranno.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gigi90 Profilo | Senior Member

Graze per la risposta, il codice è solo esemplificativo(per simulare il caso), io vorrei sapere se esiste una soluzione per permettere il lock condiviso, quindi ci si puo accedere in lettura. Grazie

lbenaglia Profilo | Guru

>Graze per la risposta, il codice è solo esemplificativo(per simulare
>il caso), io vorrei sapere se esiste una soluzione per permettere
>il lock condiviso, quindi ci si puo accedere in lettura.
l'isolation transaction level di default di SQL Server è read committed che mantiene gli shared lock sulle righe in lettura dalla transazione corrente in modo da prevenire che altre transazioni possano modificarle.
La matrice di compatibilità la trovi al seguente link:
http://msdn.microsoft.com/en-us/library/ms186396.aspx

Come vedi gli shared lock sono incompatibili solo con i lock IX, SIX e X peranto non vengono bloccare eventuali letture eseguite da altre transazioni.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

gigi90 Profilo | Senior Member

Scusa la mia ottusagine quindi non posso fare select in una stressa transazione su tabelle che ho modificato in precedenza?
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5