是否可以跳出当前的TransactionScope并插入数据

时间:2013-02-05 14:36:19

标签: .net database transactions transactionscope

请考虑以下事项:

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

现在我想让InsertDataInTableOneouterScope交易之外运行。这是一个简化的表示形式,因为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的事实吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

另一个原因是我不喜欢全能公司框架。