Linq, SQL Server e transazioni
Il modo migliore per gestire in Linq una transazione è quello di utilizzare la classe TransactionScope utilizzando un codice del genere:
dim p As Product = Nothing
Using dc = DBDataContext()
p = New Product()
p.Code = “ABC”
p.Description = “Product ABC”
dc.Products.InsertOnSubmit(p)p = New Product()
p.Code = “XYZ”
p.Description = “Product XYZ”
dc.Products.InsertOnSubmit(p)Using ts = New TransactionScope()
dc.SubmitChanges()
ts.Complete()End Using
End Using
Per ulteriori informazioni si veda LINQ to SQL: .NET Language-Integrated Query for Relational Data – Transactions.
Questo approccio estremamente semplice e lineare (il rollback avviene in assenza dell’invocazione del metodo Complete) ha però dei requisiti.
- Se la versione di SQL Server è la 2005 o superiore le transazioni vengono eseguite senza ricorrere al servizio DTC (Distributed Transaction Coordinator) con vantaggi a livello di performance (a riguardo si veda System.Transactions Integration with SQL Server).
- Nel caso di SQL Server 2000 viene invece utilizzato il servizio DTC che deve essere opportunamente configurato. A riguardo si vedano MSDTC Service enable issues when Using .NET TransactionScope e MS DTC Service.
Nei casi in cui non è possibile configurare il DTC, ma si deve utilizzare un SQL Server 2000 è possibile gestire la transazione creandola tramite la connessione:
dim p As Product = Nothing
Using dc = DBDataContext()
p = New Product()
p.Code = “ABC”
p.Description = “Product ABC”
dc.Products.InsertOnSubmit(p)p = New Product()
p.Code = “XYZ”
p.Description = “Product XYZ”
dc.Products.InsertOnSubmit(p)dc.Connection.Open()
Using ts = dc.Connection.BeginTransaction()
dc.Transaction = ts
Try
dc.SubmitChanges()
ts.Commit()Catch ex As Exception
ts.Rollback()
‘Messaggio di erroreEnd Try
dc.Transaction = Nothing
End Using
dc.Connection.Close()
End Using