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();
}
如果您没有完成事务范围,它将回滚。有两种方法可以解决此问题
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();
}