回滚c#

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

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; } } } 

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


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

 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方法,您不需要设置任何特殊的东西 – 大多数都是自动的。 您当然可以选择将连接传递给方法,但是它们也可以获得自己的连接,并且在大多数情况下它可以正常工作。

您可以使用TransactionScope。

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

如果您没有完成transactioncope,它将被回滚。

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

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