菜瓜:上次的AOP理论知识看完收获挺多的,虽然有一个自定义注解的demo,但还是觉得差点东西
水稻:我也觉得没有跟一遍源码还是差点意思,这次结合@Transactional注解深入源码看一下
菜瓜:事务注解,这个平时用的挺多的
水稻:是吗?来看看你的基础咋样
要保证一个方法中多个数据库操作的原子性,要共用一个数据库连接,但是coding时我们不用显示传递连接对象,这是咋弄的?
如果一个方法里面只有查询操作,是否不用开启事务?
如何解决非事务方法调用本地事务方法失效的?
注解常用的传播属性,你知道他们的区别吗
菜瓜:虽然没看过源码,我大胆猜测一下
隐式传递连接对象可以将其封装到线程中,一般一次请求操作都是在一个线程中完成。使用ThreadLocal将连接和线程绑定
查询操作也得看业务场景,如果多次查询相同的数据要避免不可重复读问题,可开启只读事务 (readOnly = true)
结合AOP的知识,这里其实要解决调用事务方法的对象不是代理对象的问题。用代理对象调本地事务方法即可(注入自己)
/** * @author QuCheng on 2020/6/24. */ @Service public class ItemServiceImpl implements ItemService { @Resource private IcbcItemMapper itemMapper; @Resource private ItemService itemService; @Override public void changeNameById(Long itemId) { // changeItemById(itemId); itemService.changeItemById(itemId); } @Transactional(rollbackFor = RuntimeException.class) @Override public void changeItemById(Long itemId) { itemMapper.updateNameById(itemId, "name4"); int a = 10 / 0; itemMapper.updatePriceById(itemId, 100L); } }