业务需求:
有个AService和BService都配置了事务,AService调用了BService,BService需要记录日志,但是当BService出现异常的时候,发现没有记录日志,原因是AService和BService配置事务的时候有个参数propagation,默认都配置了REQUIRED
<tx:method name=“save*” propagation=“REQUIRED”/>
使用这种策略时BService将使用Aservice的事务,所以AService回滚将整个方法体内的任何东西都回滚了。所以解决这种业务场景就需要BService配置独立的事务,不管业务逻辑的Aservice是否有异常,BService日志都应该能够记录成功。
所以解决上面setCallback回调不抛异常出去的问题,配置修改成saveOrder配置独立事务可以解决问题。
<tx:method name=“save*” propagation=“REQUIRED”/>
<tx:method name=“update*” propagation=“REQUIRED”/>
<tx:method name=“delete*” propagation=“REQUIRED”/>
<tx:method name=“saveOrder” propagation=“REQUIRES_NEW” rollback-for=“java.lang.Exception”/>
具体的业务场景应该使用不同的事务类型,而并不是一味的使用REQUIRED,最后贴下Spring的七种事务传播行为类型:
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。