Spring事务的传播和隔离级别简单总结
源地址:http://www.yshjava.cn/post/560.html
Spring事务分两种形式,声明式事务和编程式事务。Spring的声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。
我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。
在上述事务属性中,传播行为和隔离级别尤其重要,在使用时务必理解到位。
propagation
propagation属性决定事务的传播行为,有以下选项可供使用:
•REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
•SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
•MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
•REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
•NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
•NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
•NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作。
isolation(事务隔离级别)
•SERIALIZABLE:最严格的级别,事务串行执行,资源消耗最大;
•REPEATABLE_READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
•READ_COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
•READ_UNCOMMITTED:保证了读取过程中不会读取到非法数据。
•DEFAULT:Spring默认的事务隔离级别。
隔离级别在于处理多事务的并发问题。我们知道并行可以提高数据库的吞吐量和效率,但是并不是所有的并发事务都可以并发运行,这需要查看数据库教材的可串行化条件判断了。
Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用,PlatfromTransactionManager是Spring事务管理的核心接口。Spring针对不同的事务,Spring进行了不同的实现,例如对Hibernate事务的实现HibernateTractionManager,对JPA的JpaTransactionManager等等。
关于Spring事务的传播和隔离级别的更加详细的解释,这里推荐一篇好文章《Springtransaction事务--Isolation&Progation》http://guanzhilibai.blog.163.com/blog/static/1358799320120120424489/,另外在Spring中配置事务的方式有五种,如需了解详情,请参见文章《Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别》http://blog.csdn.net/it_man/article/details/5074371