9

我有 2 个表格查询和详细信息。在保存按钮上单击我已经写了

fbsave();
fbsavedetails();

fbsave()将数据保存在查询表中,fbsavedetails()将数据保存在明细表中。

现在如果 fbsavedetails() 发生错误,那么这两个步骤都应该回滚。

是否可以?

4

3 回答 3

8

您可以显式创建一个事务并传递它,即

using(var connection = ...)
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        try
        {
            FBSave(connection, tran);
            FBSaveDetails(connection, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}

请注意,您还必须在每个命令上设置Transaction,因此需要将其传入,并且所有命令必须在同一个连接对象上。


或者:您可以使用TransactionScope; 重要的是Open()发生在内部TransactionScope获得自动登记:

using(var tran = new TransactionScope())
{
    FBSave();
    FBSaveDetails();
    tran.Complete();
}

或者:

using(var tran = new TransactionScope())
using(var connection = ...)
{
    connection.Open();
    FBSave(connection);
    FBSaveDetails(connection);
    tran.Complete();
}

使用这种TransactionScope方法,您不需要设置任何特殊的东西 - 大部分都是自动的。您当然可以选择将连接传递给方法,但它们也可以获得自己的连接,并且在大多数情况下它会正常工作。

于 2012-12-19T07:18:46.570 回答
7

您可以使用事务范围。

using(var scope = new TransactionScope())
{
   //Complete the transaction only when both inserts succeed. 
   scope.Complete();
}

如果您没有完成事务范围,它将被回滚。

于 2012-12-19T07:19:22.623 回答
1

有两种方法可以解决这个问题

  1. 使用 DbTransaction 并围绕这两个方法传递 DbTransaction,如果成功则提交事务,如果发生错误则回滚缺点:需要传递 DbTransaction。
  2. 使用TransactionScope优点:易于使用缺点:不支持Access,如果数据库是sql2000,需要配置msdtc
于 2012-12-19T07:26:37.897 回答