Spring的事务有7个传播行为和5个隔离级别。
Spring的事务传播行为
propagation:Spring的事务传播属性,分为七种传播行为。之所以会有这个概念,是因为可能在一个被事务管理的方法中调用了另一个被事务管理的方法,如下:
class ServiceA{
void methodA(){
new ServiceB().methodB();
}
}
class ServiceB{
void methodB(){
}
}
PROPAGATION_REQUIRED
支持当前事务,如果当前存在事务则加入该事务;如果当前没有事务,则会新建一个事务。这是默认的事务传播行为,也是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,则以非事务方式执行。
PROPAGATION_MANDATORY
支持当前事务,如果当前没有事务,则会抛出异常。
PROPAGATION_REQUIRES_NEW
新建一个事务,如果当前存在事务,则会将其挂起。
PROPAGATION_NOT_SUPPORTED
不支持事务,以非事务方式执行操作,如果当前存在事务,则会将其挂起。
PROPAGATION_NEVER
不支持事务,如果当前存在事务,则会抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则运行在一个嵌套的事务中;如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
该传播行为与PROPAGATION_REQUIRES_NEW的区别是:
前者的事务是嵌套的,属于当前事务的子事务,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager
事务管理器起效。如果父事务commit或rollback,内嵌事务也会commit或rollback。
后者新建的事务与原本事务是各自独立的,会将原本的事务挂起,当自身结束时原本的事务才会继续执行。
Spring的事务隔离级别
isolation:Spring事务的隔离级别属性,有5种隔离级别。实际上事务的隔离级别并不是由Spring容器决定的,而是由底层数据库决定的。
ISOLATION_DEFAULT
使用数据库默认的事务隔离级别。
ISOLATION_READ_UNCOMMITTED
读未提交,会发生脏读、不可重复读、幻读
ISOLATION_READ_COMMITTED
读提交,会发生不可重复读、幻读
ISOLATION_REPEATABLE_READ
可重复读,会发生幻读
ISOLATION_SERIALIZABLE
可串行化,不会发生脏读、不可重复读、幻读
- 有想了解数据库的事务隔离级别的可以参考这篇文章
转载链接