以下内容均摘自Spring实战3 中
事务属性:声明式事务是通过事务属性来定义的, 事务属性包含了五个方面:传播行为、隔离级别、回滚规则、是否只读、事务超时
传播行为的大概就是新的事务是否被挂起, 或者方法是否要在事务环境中运行 一下为spring提供的多种传播规则选择:
MANDATORY:标示该方法必须要在事务中运行。如果当前事务不存在 则抛出一个异常
NESTED:表示如果当前已存在一个事务,那么该方法将会在嵌套事务中运行, 嵌套事务可以独立的提交或回滚,如果当前事务不存在 则和REQUIRED属性一样
NEVER:该方法不在事务上下文中运行 如果当前事务存在则抛出一个异常
NOT_SUPPORTED:表示该方法不在事务中运行,当前事务将被被挂起
REQUIRED:当前方法必须运行在事务中,如果当前事务不存在则启动一个新的事务
REQUIRES_NEW:当前方法必须运行在自己的事务中,如果当前事务存在,则开启一个新的事务并挂起当前事务
SUPPORTS:表示当前方法不需要事务上下文,如果存在当前事务则会在该事务中运行
隔离级别:定义了一个事务可能受到其他并发事务影响的程度 并发事务有可能导致下列问题
脏读:脏读发生在一个事务获取了另一个事务修改但为提交的情况下,当另一事务将数据回滚后第一个事务获取的数据就是无效的
不可重复读:不可重复读发生在一个事务进行了两次或两次以上查询得到的数据不一致的情况下。通常原因是因为另一个并发事务在两次查询期间内做了修改
幻读:一个事务在获取一部分数据后其他并发事务插入了诺干数据,导致第一个事务就会发现多了一些原本不存在的数据
spring提供了如下几种隔离级别:
DEFAULT:使用后端数据库默认的隔离级别
READ_UNCOMMITTED:允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读取
READ_COMMITTED:允许读取并发事务提交的数据,可以阻止脏读,但还是有幻读和不可重复读的情况发生
REPEATABLE_READ:对同一字段多次读取结果是一致的。可以阻止脏读和不可重复读取。但还是有幻读发生的可能
SERIALIZABLE:完全服从ACID的隔离级别,可以阻止如上所有情况的发生。这是最慢的事务隔离级别。通常是通过锁定事务相关的数据表来实现的
只读:如果事务对后端数据库进行只读操作,数据库可以利用事务的只读性来进行一些特定的优化操作。只读属性只对那些具有启动一个新事务的传播行为有效。如果采用hibernate作为持久化机制,那么将事务设置为只读属性将会导致hibernate的flush模式被设置为FLUSH_NEVER.这会告诉hibernate避免和数据库进行不必要的对象同步直到事务结束后