什么是使用linq到sql进行显式事务的正确方法?

时间:2010-04-30 14:43:26

标签: linq-to-sql transactions datacontext

我有一些场景,我需要在datacontext上多次调用.SubmitChanges(),但我想自己显式控制事务以使其成为原子。有一段时间我一直在这样做,创建一个连接,在该连接上创建一个事务,然后创建datacontext并传递它们。让我们假设现在我不想使用TransactionScope。我的代码如下所示:

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Using trans = conn.BeginTransaction()
      Dim dc as new DataContext(conn)
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

我开始使用Linq To SQL分析器,它破坏了这段代码。出于某种原因,它们要求您使用datacontext上的.Connection属性来创建事务。如果直接使用连接变量(我认为这很愚蠢),它会失败。我的问题是,这样做是否更合适:

Using conn As New SqlConnection("connection string...")
   conn.Open()
   Dim dc as new DataContext(conn)
   Using trans = dc.Connection.BeginTransaction()
      dc.Transaction = trans

      ' do some work 

      trans.Commit()
   End Using
End Using

这是更广泛接受的方式吗?

3 个答案:

答案 0 :(得分:0)

第二个片段对我来说似乎不合适。使用第二个代码片段,您需要在创建上下文之后创建事务,这至少 - 从可读性/可维护性角度来看不太有用。我试着想象一下,当你需要创建两个DataContext类时,代码会是什么样子,并在创建第一个上下文后创建事务(仅限)。这使得保持干净的分离代码非常困难。

我认为您应该发送邮件给Hibernating Rhinos并询问他们是否修复了这个错误。

答案 1 :(得分:-1)

Product prod = db.Products.Single(p => p.ProductID == 15);

if (prod.UnitsInStock > 0)
   prod.UnitsInStock--;

using(TransactionScope ts = new TransactionScope()) {
   db.SubmitChanges();
   ts.Complete();
}

http://msdn.microsoft.com/en-us/library/bb425822.aspx

答案 2 :(得分:-1)