请考虑以下事项:
using (var outerScope = new TransactionScope())
{
InsertDataInTableOne();
InsertDataInTableTwo();
InsertDataInTableThree();
outerScope.Complete();
}
现在我想让InsertDataInTableOne
在outerScope
交易之外运行。这是一个简化的表示形式,因为TransactionScope
创建了多个链中的调用,因此我无法将调用InsertDataInTableOne
放在TransactionScope
创建之外。
我也知道这可能不是一个好习惯,而且我们正在努力解决问题。但是我们现在需要这个快速修复。
using (var outerScope = new TransactionScope())
{
using (var innerScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
InsertDataInTableOne();
innerScope.Complete();
}
InsertDataInTableTwo();
InsertDataInTableThree();
outerScope.Complete();
}
那不起作用。我甚至尝试先创建TransactionScope
Suppress
,然后RequiresNew
。
那么可以立即在数据库中插入数据,有效地忽略了你在TransactionScope
的事实吗?
连接是在这些方法之外进行的(实际上,在进入被调用的服务时)。
答案 0 :(得分:0)
不确定这是否会对任何人有所帮助,但你永远不会知道。问题在于定制的公司框架。我相信,实现使嵌套事务变得困难。我们现在通过删除外部事务(这是几层)并在我们的块中创建两个单独的事务来修复它:
using (var scopeOne = new TransactionScope())
{
InsertDataInTableOne();
scopeOne.Complete();
}
using (var scopeTwo = new TransactionScope())
{
InsertDataInTableTwo();
InsertDataInTableThree();
scopeTwo.Complete();
}
同样,这是一个非常特定于我们代码的解决方案。使用RequiresNew
通常应该可以解决问题。因此,如果它不起作用,可能首先查看您自己的代码;)
另一个原因是我不喜欢全能公司框架。