一、Spring中声明式事务注解中的参数
- propagation传播机制
- isolation隔离级别
- timeout超时时间,如果共用一个事务,只有之前的事务设置的tomeout有效
- rollbackFor回滚异常
- noRollbackFor不会回滚异常
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,
timeout = 10000,rollbackFor = Exception.class,noRollbackFor = RuntimeException.class)
public void transactionalDemo(){
System.out.println("transactionalDemo");
}
二、事务的传播机制
- REQUIRED:是默认的传播机制,如果B方法中调用A,如果B中有事务,则A无论是否开启事务都会使用B的事务,任何地方出现异常A和B都会回滚。
- REQUIRES_NEW:每次都会开启一个新的事务,外面事务回滚,里面事务不会回滚。
- NESTED:开启新事务,提交事务依赖于外层事务,如果外层事务回滚,则里面的事务也回滚。
- SUPPORTS:如果存在一个事务,支持当前事务,如果没有事务,则非事务的执行,完全依赖最外层事务。
- MANDATORY:必须运行在事务里面。
- NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
private final int value;
private Propagation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
三、事务的隔离级别
- DEFAULT:数据库默认的隔离级别。
- READ_UNCOMMITTED:读未提交,会出现脏读问题。
- READ_COMMITTED:读已提交,避免脏读,出现不可重复读问题。
- REPEATABLE_READ:可重复读,避免了脏读和不可重复读。
- SERIALIZABLE:串行化。
public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8);
private final int value;
private Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
四、事务的特点
- 原子性:一个事务是一个不可分割的工作,事务中包括的操作要么都成功,要么都失败。
- 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。
- 隔离性:一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性:事务一旦提交,它对数据库中数据的改变就是永久性的。
五、事务的失效场景
- 非public方法,事务的实现原理是代理增强,非public不能进行代理增强,不能进行JDK代理或者CGLib代理,cglib代理是非private的就可以代理。
- 调用本类的方法。
- 抛出的异常非RuntimeException,如果想要捕获所有异常rollbackFor={Exception.class}。
- 如果数据库不支持事务,那么也是失效的。
总结
有没有人曾告诉你,你认真的样子真帅