您的位置:首页 > 编程语言 > Java开发

Spring事务传播行为和隔离级别

2017-10-11 11:25 253 查看
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

可串行化,不会发生脏读、不可重复读、幻读

有想了解数据库的事务隔离级别的可以参考这篇文章

转载链接

浅析Spring事务传播行为和隔离级别

浅谈Spring事务隔离级别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: