spring-transaction
spring事务实现的原理以及事务的传播性
事务实现
- @Transactional注解的方法内,以及
内部的子调用不要try-catch - 硬编码
事务传播
事务A内部调用了事务B,两个事务怎么协调? 1: 合并到外部事务A, 2: 各自独立commit
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
}
REQUIRED
Spring默认的事务传播机制,如果外层有事务则当前事务加入到外层事务,一块提交一块回滚,如果外层没有事务则当前开启一个新事务
REQUIRES_NEW
每次新开启一个事务,同时把外层的事务挂起,当前新事务(子事务)执行完毕后在恢复上层事务的执行
SUPPORTS
如果外层有事务则加入该事务,如果不存在也不会创建新事务,直接使用非事务方式执行
NOT_SUPPORTED
不支持事务,如果外层存在事务则挂起外层事务 ,然后执行当前逻辑,执行完毕后,恢复外层事务。
NEVER
不支持事务,如果外层存在事务则直接抛出异常
MANDATORY
传播机制是说配置了该传播性的方法只能在已经存在事务的方法中被调用(强制),如果在不存在事务的方法中被调用,会抛出异常
NESTED
可以保存状态保存点,当事务回滚后会回滚到某一个保存点上,从而避免所有嵌套事务都回滚
事务隔离
acid
并发问题
- 脏读
- 不可重复读 -> mvcc
- 幻读 -> next_lock
隔离级别
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable