Spring核心知识点 - 事务传播特性
事务隔离级别
脏读:读取了其他事务修改但回滚(未提交)的数据
不可重复读:A事务对同一条数据多次读取,其间B事务对该条数据进行了更改,导致A事务对同一条数据前后读取不一致
幻读:在范围查询时,有其他事务在该范围中新增了数据,导致前后获取到的数据总数不一致
事务传播特性
失效场景:
- 修饰非public方法:Spring Aop代理时,只会对public方法读取 @Transactional注解 开启事务配置
- 类内部调用不触发事务:事务是基于动态代理实现的,一个类内部调用不会经过代理方法,无法触发织入的代码
- 数据库引擎不支持事务
PS: read-only属性 - 为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true
tips:
- Spring事务和线程相关联,底层是一个
ThreadLocal<Map<DataSource, Connection>>
,一个线程一个链接一份事务。 - innoDB通过MVCC(快照读-多版本并发控制)和LBCC(当前读-基于锁的并发控制)解决了RR隔离级别下的幻读问题。
- 事务的挂起:TransactionManager实现事务是通过Aop代理控制connection,当需要挂起事务时,则获取新的connection进行操作即可。
欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友
-- 星河有灿灿,愿与之辉