spring事物传播机制
类型 | 描述 |
---|---|
REQUIRED | 支持当前事务,如果当前没有事务,就新建一个事物。这是最常见,默认的选择。 |
SUPPORTS | 支持当前事务,如果当前没有事务,就以非事物方式执行。 |
MANDATORY | 支持当前事务,如果当前没有事务,就跑出异常。 |
REQUIRES_NEW | 新建事务,如果当前存在事务,就把当前事务挂起,开始新建事务。 |
NOT_SUPPORTED | 以非事务方式执行, 如果当前存在事务,就把当前事务挂起。 |
NEVER | 以非事务方式运行,如果当前存在事务,就跑出异常。 |
NESTED | 如果当前存在事务,就嵌套在事务类执行,如果没有事务,就执行与REQUIRED类似的操作。 |
上面的描述都很清晰,除了NESTED,经过自己写代码测试,个人理解,NESTED在当前存在事务的时候,会在当前事务里面新建一个子事务,子事务回滚,父事务不一定会回滚(catch 了相应异常);但是父事务回滚,NESTED新建的子事务也会回滚。
⚠️
spring 事务是通过动态代理(切面)来实现的。所以在对象间调用方法时,Spring会将动态代理增强后的对象-代理类 注入到调用方,调用的方法是spring动态代理增强的具有事务管理功能的对象的方法,而在对象内部调用,spring 事务不会生效,因为调用的是没有被aop增强的原对象方法。
spring事务隔离级别
隔离级别 | 含义 |
---|---|
DEFAULT | 使用数据库默认的隔离级别 |
READ_UNCOMMITTED | 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。 |
READ_COMMITTED | 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。 |
REPEATABLE_READ | 可重复读,在事务里,每次读取数据的结果都一样,不管其他事务的结果有没有提交。可能会造成幻读。MySQL默认的隔离级别 |
SERIALIZABLE | 串行化,一个事务提交前,其他事物将被挂起。就是说,在同一时间只有一个事务操作表。 |
分布式事务
分布式事务是指操作多个数据库之间的事务,spring的org.springframework.transaction.jta.JtaTransactionManager,提供了分布式事务支持。
1 |
|
数据库及事务配置
1 | true) (proxyTargetClass = |