我遇到了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查询已正确执行。
问题是:如何将方法标记为不使用该交易?我不想使用传播,因为我希望暂停当前的交易。
我的项目有业务代码流,有事务处理,我想标记任何部分肯定是非事务性的。
答案 0 :(得分:1)
您提到能够从日志中判断出新事务已启动。什么日志,数据库或应用程序?你用的是什么数据库?有些数据库根本不允许您在事务外部运行查询,因此只需在内部为您启动...
更新
您的问题与此类似:
我会确保您运行的是具有此修复程序的Spring.NET版本(看起来像v 1.3.1或更高版本?)
此外,您可以尝试手动抑制事务并查看是否可以修复该行为:
using(var tx = new TransactionScope(TransactionScopeOption.Suppress))
{
// make DB call...
}