网站开发语言检测,玉林市网站开发公司,WordPress 云锁,网站怎么更新数据问题#xff1a;
在Spring管理的项目中#xff0c;方法A使用了Transactional注解#xff0c;试图实现事务性。但当同一个class中的方法B调用方法A时#xff0c;会发现方法A中的异常不再导致回滚#xff0c;也即事务失效了。
原因#xff1a;
Transactional是Spring提供…问题
在Spring管理的项目中方法A使用了Transactional注解试图实现事务性。但当同一个class中的方法B调用方法A时会发现方法A中的异常不再导致回滚也即事务失效了。
原因
Transactional是Spring提供的事务管理注解。
重点在于Spring采用动态代理(AOP)实现对bean的管理和切片它为我们的每个class生成一个代理对象。只有在代理对象之间进行调用时可以触发切面逻辑。Spring动态代理详情可戳spring自动加载使用实现类无法加载使用接口却可以的原因
而在同一个class中方法B调用方法A调用的是原对象的方法而不通过代理对象。所以Spring无法切到这次调用也就无法通过注解保证事务性了。
解决方法1
将事务方法放到另一个类中或者单独开启一层取名“事务层”进行调用即符合了在对象之间调用的条件。
解决方法2
获取本对象的代理对象再进行调用。具体操作如 Spring-content.xml上下文中增加配置aop:aspectj-autoproxy expose-proxy“true”/ 在xxxServiceImpl中用(xxxService)(AopContext.currentProxy())获取到xxxService的代理类再调用事务方法强行经过代理类激活事务切面。
解决方法3
很多时候方法内调用又希望激活事务是由于同一个方法既有DAO操作又有I/O等耗时操作不想让耗时的I/O造成事务的太长耗时比如新增商品同时需要写入库存。此时可以将I/O做成异步操作如加入线程池而加入线程池的操作即便加入事务也不会导致事务太长问题可以迎刃而解。