C# 在c中回滚#

C# 在c中回滚#,c#,ado.net,C#,Ado.net,我有两张查询表和详细资料。 在“保存”按钮上单击“我已编写” fbsave(); fbsavedetails(); fbsave()将数据保存在查询表中,fbsavedetails()将数据保存在明细表中 现在,如果fbsavedetails()中出现错误,则应回滚这两个步骤。 有可能吗?您可以显式创建一个事务并传递它,即 using(var connection = ...) { connection.Open(); using (var tran = connection.

我有两张查询表和详细资料。 在“保存”按钮上单击“我已编写”

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

现在,如果fbsavedetails()中出现错误,则应回滚这两个步骤。


有可能吗?

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

using(var connection = ...)
{
    connection.Open();
    using (var tran = connection.BeginTransaction())
    {
        try
        {
            FBSave(connection, tran);
            FBSaveDetails(connection, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}
请注意,这里您必须对每个命令设置
事务
,因此您需要传入它,并且所有命令必须位于同一个连接对象上


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

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


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

您可以使用TransactionScope

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

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

有两种方法可以解决此问题

  • 使用DbTransaction并围绕两个方法传递DbTransaction,如果成功则提交事务,如果发生错误则回滚 缺点:需要传递DbTransaction
  • 使用TransactionScope 优点:易于使用 缺点:不支持访问,如果数据库是sql2000,则需要配置msdtc

  • MS Access或SQL Server?您如何处理数据层?存储过程?linq到sql?有联系的?断开连接?您可以通过使用事务来做您想做的事情,当然,这是可能的。请您提供这两种方法的框架,然后请提供什么调用?“断开连接的体系结构”-您能更具体一些吗?这是非常模糊、模糊和过载的。是否“打开内部TransactionScope以获得自动登记”否定了DTC的需要?@MrMoose否,但您通常可以通过传递连接来避免DTC的需要:如果您在
    TransactionScope
    中仅使用一个连接对象,然后它由LTM而不是DTC处理(在所有版本的SQL Server>=2005,IIRC中)
    using(var scope = new TransactionScope())
    {
       //Complete the transaction only when both inserts succeed. 
       scope.Complete();
    }