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.
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 errore
End Try
dc.Transaction = Nothing
End Using
dc.Connection.Close()
End Using