在配置ssm的applicationContext-trans.xml文件的时候涉及到了事务的传播属性:
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
那么propagation属性中具体有哪些数值呢?
- Required(需要)
- Mandatory(强制必须)
- RequiresNew(需要新的)
- Supports(支持)
- NotSupported(不支持)
- Never(不用)
Required
:当前方法必须要求开启事务,如果当前线程不存在事务,则开启新的事务,如果当前线程已经存在事务,就加入到当前事务。这个是经常使用的。但是要注意的就是一旦事务中某一个方法回滚,当前事务上下文里面所有的操作都回滚,考虑到下面一个例子:
假设A和B的事务都是Required,那么当调用MethodA的时候,如果methodB回滚了,对A的修改也就回滚了。所以上面的代码不会达到预期的结果,也就是说A不可能修改成为99。
Required New
:当前方法必须要求开启新的事务,如果当前线程已经存在事务上下文,就暂停当前事务,等到新事务结束之后,再继续恢复之前的事务。就拿上面的例子来说,methodB的对事务的修改不会影响到methodA。两个事务之间不会互相影响。经常可以用到的场景就是在业务发生异常的时候发送短消息。如果业务发生异常,业务回滚,但是由于发送段消息是新的事务,不会受到业务异常的影响。
Mondary
:当前方法必须要求事务,如果当前线程不存在事务,就抛出异常,如果存在,就加入到事务里。
Support
:当前方法支持事务,如果当前线程存在事务,就加入到事务中去,如果不存在,不做任何操作。
Not Support
:当前方法不支持事务,如果当前线程存在事务,就挂起当前事务,执行完当前方法,恢复事务。一般情况下在查询的时候使用,如果一个方法只是查询,并且非常耗时,就可以使用Not Support,避免事务时间超长。
Never
:当前方法不支持事务,如果当前线程存在事务,则抛出异常。这种用的比较少。