18

我可以使用带有数据上下文的事务,以便在出错后回滚上下文的状态吗?如果是这样,它是如何工作的?

4

5 回答 5

19

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

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

  dc.SubmitChanges();
}
finally
{
  dc.Transaction.Rollback();
}

更新

事后这总是会回滚。我在测试中使用它。

于 2009-05-15T09:07:11.773 回答
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();
    }
}

如果 Complete() 没有被调用,那么事务将被回滚。如果存在包含事务范围,则内部事务和外部事务都需要完成才能提交数据库上的更改。

于 2009-05-15T10:12:35.800 回答
14

它不像 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();
    }
}

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

于 2011-04-08T11:00:11.503 回答
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
}
于 2009-05-15T10:11:41.853 回答
0

是这样的:

using (YourDatacontext m_DB = new YourDatacontext())
using (TransactionScope tran = new TransactionScope())
{
   try
   {
      //make here the changes
      m_DB.SubmitChanges();
      tran.Complete();
   }
   catch (Exception ex)
   {
       Transaction.Current.Rollback();
   }
}
于 2013-07-23T19:57:35.587 回答