我正在使用带有C#的SQLServer。
foreach(var item in list)
{
TransactionOptions transOption = new TransactionOptions();
transOption.IsolationLevel =
System.Transactions.IsolationLevel.ReadUncommitted;
using (TransactionScope scope = new
TransactionScope(TransactionScopeOption.Required, transOption))
{
//Code to select
//Code to insert
scope.Complete();
}
}
第一次(列表中的第1项)交易未提交。但我可以在SQL事件探查器中看到选择和插入查询。任何地方都不例外。
但是第二次(列表中的第2项)以及剩下的项目已经提交。
如果我换成TransactionScopeOption.Suppress
,第一项本身就会被提交。但我不知道什么是'抑制'
TransactionScope(TransactionScopeOption.Suppress, transOption))
{
//Code to select
//Code to insert
scope.Complete();
}
所以,为什么TransactionScopeOption.Required
和TransactionScopeOption.RequiredNew
无法提交?我需要做些什么改变来提交?
感谢您的帮助。
答案 0 :(得分:1)
很难说为什么第1项有奇怪的行为。但是你应该知道几件事情:
实际提交不在scope.Complete();
上,而是在TransactionScope
处理时发生。
TransactionScopeOption.Required
保证范围内的insructions将被事务包装。它可以通过两种方式实现:a)如果存在环境外部事务,则内部范围不会创建自己的事务。如果调用outerScope.Complete()
然后处理外部事务范围,则实际提交b)如果没有外部事务,则创建自己的事务。
TransactionScopeOption.RequiresNew
始终创建自己的独立交易。
TransactionScopeOption.Suppress
不会创建任何事务并忽略任何外部事务。由于没有任何事务要保存更改,因此不需要scope.Complete();
,也无法回滚更改。
我希望这些信息可以帮助您了解您的具体情况。
答案 1 :(得分:0)
尝试重构代码,如下所示:
TransactionOptions transOption = new TransactionOptions();
transOption.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (TransactionScope scope = new
TransactionScope(TransactionScopeOption.Required, transOption))
{
foreach(var item in enter code here`list)
{
//your code
scope.Complete();
}
}
有关Supress的详细信息,请参阅been posted for three.js before论坛问题。