C# 不支持Spring.net事务传播
我在TransactionPropagation.NotSupported方面遇到麻烦。我相信这种传播会导致代码在没有事务的情况下执行。意味着当我标记特定方法时,当前事务将被挂起,代码将在没有任何事务的情况下执行 当前版本的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) {
[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包含修复的行为。