C# 不支持Spring.net事务传播

C# 不支持Spring.net事务传播,c#,nhibernate,spring.net,C#,Nhibernate,Spring.net,我在TransactionPropagation.NotSupported方面遇到麻烦。我相信这种传播会导致代码在没有事务的情况下执行。意味着当我标记特定方法时,当前事务将被挂起,代码将在没有任何事务的情况下执行 当前版本的spring.net将创建新的事务。请参阅以下代码: [Test] public void A() { TransactionTemplate template = new TransactionTemplate(TransactionManager) {

我在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;
        });
}
[测试]
公共图书馆A(){
TransactionTemplate=新TransactionTemplate(TransactionManager){
PropagationBehavior=TransactionPropagation.NotSupported
};
执行(委托){
断言.AreEqual(0,
SessionFactory.GetCurrentSession().Linq()。
其中(t=>t.Id.Equals(YYY)).ToList().Count);
返回null;
});
}
我希望这种表示法会导致linq查询在没有事务的情况下执行,并且它会抛出新的异常。但是日志显示它会自动创建新会话和事务

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

问题是:如何将方法标记为它根本不使用事务?我不想使用传播,因为我希望当前事务将被挂起


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

您提到可以从日志中判断新事务已启动。什么日志,数据库还是应用程序?你在使用什么数据库?有些数据库根本不允许您在事务外部运行查询,所以只需要在内部为您启动一个查询


更新:

您的问题与此类似:

我会确保您正在运行的Spring.NET版本中包含此修复程序(看起来像是V1.3.1或更高版本?)

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

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

由我的测试生成的Log4net日志。NHibernate记录调试模式范围内的一些有用信息。我正在使用MSSQL。谢谢。我已经发现了这个问题,但我不知道如何定义或使用TransactionScopeOption.Suppress和使用spring.net transaction和nhibernate。我不知道在哪里注入它,我正在使用昨天的spring.net构建,因此spring.net包含修复的行为。