如何使用datacontext进行事务处理

use*_*534 17 c# linq datacontext transactions linq-to-sql

我可以使用带有datacontext的事务,以便在出错后可以回滚上下文的状态吗?如果是这样,那怎么办?

lep*_*pie 18

我一直在测试中使用它们:)

try
{
  dc.Connection.Open();
  dc.Transaction = dc.Connection.BeginTransaction();

  dc.SubmitChanges();
}
finally
{
  dc.Transaction.Rollback();
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

这将始终在事后回滚.我在测试中使用它.

  • @Richard:我正在等你使用一个"使用"块的代码片段,它在语义上与我的相同. (4认同)
  • 你应该提一下你的样本_always_还原它的工作,或者我错了,dc.Transaction.Rollback()在dc.SubmitChanges()之后没有坏处? (3认同)
  • 打开DataContext的连接是否有任何危害?如果它已经打开怎么办-它不会抛出异常吗?将其保持打开状态怎么办?这会很浪费,无限期地保持连接状态吗? (2认同)

Ric*_*ard 15

默认情况下,DataContext将选择环境事务,因此只需确保范围内存在事务.细节成为主要问题:

  • 您需要什么选项(例如隔离级别)
  • 您是否需要新事务或重用现有事务(例如,审计/日志记录操作可能需要新事务,因此即使整个业务操作失败并因此回滚外部事务,也可以提交它.

这简化了一些原型代码,真正的代码使用帮助程序来创建具有策略驱动选项的事务(原型的目的之一是检查这些选项的影响).

using (var trans = new TransactionScope(
                           TransactionScopeOption.Required,
                           new TransactionOptions {
                               IsolationLevel = IsolationLevel.ReadCommitted
                           },
                           EnterpriseServicesInteropOption.Automatic)) {
    // Perform operations using your DC, including submitting changes

    if (allOK) {
        trans.Complete();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果未调用Complete(),则将回滚事务.如果存在包含事务范围,则内部事务和外部事务都需要完成以便对要提交的数据库进行更改.

  • +1表示包含SQL Server的IsolationLevel更改.这里解释:http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx为什么选择EnterpriseServicesInteropOption.Automatic? (2认同)
  • 在创建 TransactionScope 时,您通常是否已经拥有数据上下文?或者是否有必要创建 datacontext _inside_ 'using (var trans)'? (2认同)

Dam*_*ien 12

它不像TransactionScope方法那么简单,但据我所知,这是为LINQ-to-SQL执行此操作的"正确"方法.它不需要任何对System.Transactions的引用.

dataContext.Connection.Open();
using (dataContext.Transaction = dataContext.Connection.BeginTransaction())
{
    dataContext.SubmitChanges();

    if (allOK)
    {
        dataContext.Transaction.Commit();
    }
    else
    {
        dataContext.Transaction.RollBack();
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,只有在打算在使用中进行进一步的数据操作时才需要RollBack,否则将自动丢弃更改.

  • 这似乎比公认的答案更直接.知道为什么它不是公认的答案吗? (2认同)

Phi*_*ppe 10

这样的事情,可能是:

try
{
    using (TransactionScope scope = new TransactionScope())
    {
        //Do some stuff

        //Submit changes, use ConflictMode to specify what to do
        context.SubmitChanges(ConflictMode.ContinueOnConflict);

        scope.Complete();
    }
}
catch (ChangeConflictException cce)
{
        //Exception, as the scope was not completed it will rollback
}
Run Code Online (Sandbox Code Playgroud)