Spring的事务传播行为
-
PROPAGATION_REQUIRED ,如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
-
PROPAGATION_SUPPORTS ,如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。
-
PROPAGATION_MANDATORY ,如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
-
PROPAGATION_REQUIRES_NEW, 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
-
PROPAGATION_NOT_SUPPORTED, 总是非事务地执行,并挂起任何存在的事务。
-
PROPAGATION_NEVER ,总是非事务地执行,如果存在一个活动事务,则抛出异常
-
PROPAGATION_NESTED,如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按PROPAGATION_REQUIRED 属性执行
嵌套事务和新的事务的区别
新的事务,独立于之前的服务,互不影响提交回滚。
嵌套事务,是以之前的服务为父事务,起的一个子事务。子事务执行完之后,父事务才会接着实行。子事务的回滚不会导致父事务的回滚。但是父事务的回滚带导致子事务的回滚。父事务提交,子事务也回跟着提交。
Spring的事务配置
声明式的事务处理中,要配置一个切面,即一组方法,如
<!-- 隔离级别配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="query*" propagation="SUPPORTS" read-only="true" />
<tx:method name="list*" propagation="SUPPORTS" read-only="true" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
1、事务的传播性:@Transactional(propagation=Propagation.REQUIRED)
如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
2、事务的超时性:@Transactional(timeout=30) //默认是30秒
注意这里说的是事务的超时性而不是Connection的超时性,这两个是有区别的
3、事务的隔离级别:@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
4、回滚:
指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)
指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
5、只读:@Transactional(readOnly=true)
该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。
只读事务:如果你一次执行多条查询语句,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的查询将会出现读数据不一致的状态,此时,应该启用事务支持
网友评论