我有2个表查询和详细信息.在保存按钮上单击我已写入
fbsave();
fbsavedetails();
Run Code Online (Sandbox Code Playgroud)
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此处还必须设置Transactionon each命令,因此需要将其传入,并且所有命令必须位于同一连接对象上.
或者:你可以使用TransactionScope; 重要的是,在Open()发生内将TransactionScope获得自动入伍:
using(var tran = new TransactionScope())
{
FBSave();
FBSaveDetails();
tran.Complete();
}
Run Code Online (Sandbox Code Playgroud)
要么:
using(var tran = new TransactionScope())
using(var connection = ...)
{
connection.Open();
FBSave(connection);
FBSaveDetails(connection);
tran.Complete();
}
Run Code Online (Sandbox Code Playgroud)
使用这种TransactionScope方法,您不需要设置任何特殊的东西 - 大多数都是自动的.您当然可以选择将连接传递给方法,但是它们也可以获得自己的连接,并且在大多数情况下它可以正常工作.
您可以使用TransactionScope.
using(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
如果您没有完成transactioncope,它将被回滚.