即使未调用System.Transactions.TransactionScope.Commit(),也会提交数据
在什么情况下,包含在System.Transactions.TransactionScope
代码仍然可以提交,即使抛出exception并且最外层的范围从未调用过提交?
using (var tx = new TransactionScope())
包含一个顶级方法,并以相同的方式调用也使用TransactionScope
的方法。
我正在使用带有关联tableadapters的类型化数据集。 可能是因为某些原因,适配器中的命令没有出现? 你们中的任何人都知道如何检查他们是否参加了环境的TransactionScope吗?
答案结果是因为我在SqlConnection
对象之后创建了TransactionScope
对象。
我离开了这个:
using (new ConnectionScope()) using (var transaction = new TransactionScope()) { // Do something that modifies data transaction.Complete(); }
对此:
using (var transaction = new TransactionScope()) using (new ConnectionScope()) { // Do something that modifies data transaction.Complete(); }
现在它的工作原理!
故事的寓意是首先创建您的TransactionScope
。
显而易见的情况是显式指定了新的( RequiresNew
)/ null( Suppress
)事务 – 但是还存在可能导致连接错过事务的超时/解除绑定故障。 请参阅前面的post (修复程序只是连接字符串更改)或完整详细信息 。
请注意TransactionScope
工作原理:
它在使用范围的开头设置属性System.Transactions.Transaction.Current
,然后在使用范围结束时将其设置回先前的值。
以前的值取决于声明给定范围的位置。 它可以在另一个范围内。
你可以像这样修改代码:
using (var sqlConnection = new ConnectionScope()) using (var transaction = new TransactionScope()) { sqlConnection.EnlistTransaction(System.Transactions.Transaction.Current); // Do something that modifies data transaction.Complete(); }
我向那些代码更复杂并且不能简单地更改代码以首先打开数据库连接的人展示了这种可能性。