我有两个表:enquiry和details。 在单击保存按钮时,我已经编写了以下内容:
fbsave();
fbsavedetails();
fbsave()
将数据保存在enquiry表中,fbsavedetails()
将数据保存在details表中。
如果在fbsavedetails()中出现错误,则两个步骤都应该回滚。
这种情况是否可能发生?
我有两个表:enquiry和details。 在单击保存按钮时,我已经编写了以下内容:
fbsave();
fbsavedetails();
fbsave()
将数据保存在enquiry表中,fbsavedetails()
将数据保存在details表中。
如果在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
方法时,您无需设置任何特殊内容 - 大部分自动完成。当然,您可以选择将连接传递给方法,但它们也可以获取自己的连接,在大多数情况下都可以正常工作。TransactionScope
中只使用一个连接对象,那么它将由 LTM 而不是 DTC 处理(在所有 SQL Server >= 2005 版本中,如果我没记错的话)。 - Marc Gravellusing(var scope = new TransactionScope())
{
//Complete the transaction only when both inserts succeed.
scope.Complete();
}
如果您没有完成Transactionscope操作,它将会被回滚。
解决这个问题有两种方法: