1、spring事务隔离级别
事务隔离级别 | 描述 |
ISOLATION_DEFAULT | Read Committed,提交后可见,可避免脏读,但无法避免不可重复读和幻读 |
IOSLATION_READ_COMMITTED | Read Committed,提交后可见,可避免脏读,但无法避免不可重复读和幻读 |
ISOLATION_READ_UNCOMMITTED | Read Uncommitted,未提交后可见,无法避免脏读、不可重复读和幻读 |
ISOLATION_REPEATABLE_READ | Read Repeatable,可避免脏读、不可重复读,无法避免幻读 |
ISOLATION_SERIALIZABLE | Serializable,序列化,可避免脏读、不可重复读和幻读 |
2、spring事务传播行为
事务传播行为 | 描述 |
PROPAGATION_REQUIRED | 如果当前存在一个事务,则加入当前事务。如果不存在事务则创建一个新的事务。 |
PROPAGATION_REQUIRED_NEW | 不管当前是否存在事务,都会创建新事务。如果当前存在事务,则挂起当前事务,待require new事务执行完后在重新恢复现场。 如果某个业务操作不想被外层事务影响,则比较适合PROPAGATION_REQUIRED_NEW。 比如当前业务需要记录业务log到数据库,该操作无论操作成功或失败都需要完成,则可以将记录log单独放在PROPAGATION_REQUIRED_NEW事务中。 |
PROPAGATION_SUPPORTS | 如果当前存在一个事务,则加入当前事务。如果不存在事务则直接执行。 比如对于查询类方法PROPAGATION_SUPPORTS就是比较适合的。如果查询方法直接执行,那不需要事务支持。如果查询方法被其他已开启事务的方法调用,PROPAGATION_SUPPORTS可以保证查询方法能够加入当前事务,可洞察前事务对数据的改动。 |
PROPAGATION_MANDATORY | PROPAGATION_MANDATORY强制要求当前存在事务,如果不存在则抛异常。如果某个方法需要事务支持,但自身又没有管理事务提交或回滚,则比较适合PROPAGATION_MANDATORY。 |
PROPAGATION_NEVER | 不支持事务,若当前存在事务则挂起当前事务。 |
PROPAGATION_NESTED | 如果存在当前事务,则在当前事务的一个嵌套事务(即保存点)中执行;若无当前事务,则创建新事务。 PROPAGATION_NESTED和PROPAGATION_REQUIRES_NEW的区别是require new会挂起当前已存在事务;而nested则是寄生与当前事务,当前事务仍然处于active状态。 |