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.

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