- @Transactional不起作用
- 原因
@Transactional(rollbackFor = Exception.class) public void testTransactional() { Product product = new Product(); product.setName("测试事务"); product.setPrice(100.0); productJpaRepository.save(product); int j = 0; int i = 1/j; } public void testTransactional1() { this.testTransactional(); }- 同一个service类中,一个非事务方法A调用一个事务方法B时,会出现B的事务失效的情况,原因是因为内部方法调用的时候是调用原方法,而非代理方法。
- 解决方案:
- 方案一:
- 将testTransactional1方法抽取到一个新的类里面
- 方案二:
- 在所属service类中,引入自身的代理类,然后在testTransactional1方法中使用代理类调用testTransactional方法,不过要注意的是,为了避免循环依赖,需要在引入时加上@Lazy 注解
@Service public class ProductService { @Lazy @Autowired private ProductService selfProxy; public void testTransactional1() { selfProxy.testTransactional(); } }
- 在所属service类中,引入自身的代理类,然后在testTransactional1方法中使用代理类调用testTransactional方法,不过要注意的是,为了避免循环依赖,需要在引入时加上@Lazy 注解
- 方案一:
- 原因
- 关于@Transactional注解之前我一直以为只能用户实现接口的方法,也就是只能通过动态代理进行事务增强。后面才知道,除了动态代理,通过CGLIB也可以实现,方法实现接口不是必须的。
05-30
637
637

被折叠的 条评论
为什么被折叠?



