0

考虑以下:

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();
}

那没有用。我什至尝试先创建一个TransactionScopewith Suppress,然后再创建一个RequiresNew.

那么是否可以立即在数据库中插入数据,有效地忽略您在数据库中的事实TransactionScope

连接是在这些方法之外建立的(实际上是在进入被调用的服务时)。

4

1 回答 1

0

不确定这是否会帮助任何人,但你永远不知道。问题在于定制的公司框架。我相信,这种实现使得嵌套事务变得困难。我们现在通过移除外部事务(向上几层)并在我们的块中创建两个单独的事务来修复它:

using (var scopeOne = new TransactionScope())
{
    InsertDataInTableOne();
    scopeOne.Complete();
}

using (var scopeTwo = new TransactionScope())
{
    InsertDataInTableTwo();
    InsertDataInTableThree();
    scopeTwo.Complete();
}

同样,这是一个非常特定于我们代码的解决方案。使用RequiresNew通常应该可以解决问题。所以如果它不起作用,也许先看看你自己的代码;)

我不是全能公司框架的忠实粉丝的另一个原因。

于 2013-02-06T15:31:01.297 回答