事务的传播属性

在配置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:当前方法不支持事务,如果当前线程存在事务,则抛出异常。这种用的比较少。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值