Spring.net TransactionPropagation NotSupported

时间:2010-09-23 14:05:26

标签: c# nhibernate spring.net

我遇到了TransactionPropagation.NotSupported的麻烦。我相信这种传播会导致代码在没有事务的情况下执行。意味着当我标记特定方法时,当前事务将被暂停,代码将在没有任何事务的情况下执行。

当前版本的spring.net创建了新的事务。请参阅以下代码:

[Test]
public void A() {
        TransactionTemplate template = new TransactionTemplate(TransactionManager) {
            PropagationBehavior = TransactionPropagation.NotSupported
        };
        template.Execute(delegate {
            Assert.AreEqual(0, 
               SessionFactory.GetCurrentSession().Linq<XXX>().
               Where(t => t.Id.Equals(YYY)).ToList().Count);
            return null;
        });
}

我希望这种表示法导致linq查询在没有事务的情况下执行,它会抛出新的异常。但是日志显示它会自动创建新的会话和事务。

当我通过提到的注释标记任何方法时,我发现了这个问题,尽管注释内部的LINQ查询已正确执行。

问题是:如何将方法标记为不使用该交易?我不想使用传播,因为我希望暂停当前的交易。

我的项目有业务代码流,有事务处理,我想标记任何部分肯定是非事务性的。

1 个答案:

答案 0 :(得分:1)

您提到能够从日志中判断出新事务已启动。什么日志,数据库或应用程序?你用的是什么数据库?有些数据库根本不允许您在事务外部运行查询,因此只需在内部为您启动...


更新

您的问题与此类似:

https://jira.springframework.org/browse/SPRNET-1307?page=com.atlassian.jira.plugin.ext.bamboo%3Abamboo-build-results-tabpanel#issue-tabs

我会确保您运行的是具有此修复程序的Spring.NET版本(看起来像v 1.3.1或更高版本?)

此外,您可以尝试手动抑制事务并查看是否可以修复该行为:

using(var tx = new TransactionScope(TransactionScopeOption.Suppress))
{
    // make DB call...
}