我有 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
; 重要的是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
方法,您不需要设置任何特殊的东西 - 大部分都是自动的。您当然可以选择将连接传递给方法,但它们也可以获得自己的连接,并且在大多数情况下它会正常工作。
您可以使用事务范围。
using(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
如果您没有完成事务范围,它将被回滚。
有两种方法可以解决这个问题