我在接缝组件上使用 @Transactional 注释,类似于:
@Name( "myComponent" )
@AutoCreate
public class MyComponent
{
public void something() {
...
doWork();
}
...
@Transactional
protected void doWork() {
try {
log.debug( "transaction active: " + Transaction.instance().isActive() );
} catch (Exception ignore) {}
// some more stuff here that doesn't appear to be inside a transaction
}
}
在“更多内容”部分中,我正在修改一些 Hibernate 实体,然后遇到了引发异常的错误。我注意到异常并没有导致事务回滚(修改的实体仍在数据库中进行了修改),因此我添加了“事务活动”日志记录。当此代码执行时,isActive() 返回 false。
我有什么遗漏的吗?为什么交易不活跃?
如果重要的话,我会使用另一个组件中的 Seam 组件,该组件使用 RESTEasy 注释来触发我的方法调用。
我不熟悉 Seam 的工作原理,所以如果这个答案不适用,我提前道歉。
我注意到该方法是@Transactional
is protected
。这对我来说意味着它正在被另一个内部方法调用。
使用 Spring 的 AOP,您可以标记public方法与@Transactional
它们被包装并替换为事务代理。当外部类调用public
方法,它正在调用形成事务的代理。如果外部类调用另一个public
方法就是not标有@Transactional
然后调用一个内部方法,即不会创建任何事务,因为根本没有调用代理。
在春天,即使你改变了你的doWork()
方法公开,也会发生同样的问题。没有事务,因为没有调用代理对象。在类内部进行的方法调用不会调用代理对象。
快速阅读一些文档似乎表明,与 Spring AOP 一样,Seam 正在使用CGLib 代理 http://seamframework.org/Community/HowIsDoesSeamProxyClasses。问题是它是否能够代理所有方法——即使它们是从代理对象内部调用的。如果此答案不适用,很抱歉浪费您的时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)