赞
踩
@Transactional能标记私有方法不生效
transactional标签用于将对应包装的bean设置成一个新的代理bean对象供外部使用,就是说外部调用这个proxy bean的公共方法时先会调用开启事务等的切面工作,若设置成私有方法只能类内用this指针调用,这样被调用的bean是其本身,不是proxy对象,因此没有transactional切面的意义
问题不是私有的,也不是公开的,问题是:它是如何被调用的,以及您使用的是哪个AOP实现!
如果您使用(默认)Spring代理AOP,那么Spring提供的所有AOP功能(如@Transational)只有在调用通过代理时才会考虑。-通常情况下,如果从另一个豆子。
这有两个含义:
因为不能从另一个bean调用私有方法(例外是反射),所以它们的
@Transactional
注释没有被考虑在内。
如果该方法是公共的,但它是从同一个bean调用的,那么它也不会被考虑(只有在使用了Spring代理AOP(默认)时,这个语句才是正确的)。
@见弹簧参考:第9.6章代理机构
您应该使用AspectJ模式,而不是Spring代理,这将解决问题。AspectJ事务方面甚至被编织成私有方法(Spring3.0检查)。
方法可见性和@Transactional
在使用代理时,应用@Transactional只对具有公共可见性的方法进行注释。如果确实对受保护的、私有的或包可见的方法进行注释,则使用@Transactional注释,不会引发错误,但带注释的方法不会显示已配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(见下文)。
@Transactional注解事务不生效的 case
数据库不支持事务
注解放在了私有方法上
类内部调用
未捕获异常
多线程场景
传播属性设置问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。