spring事务配置总结

这里总结一下吧,否则像我这种记性差的人,下次遇到类似的问题还要重新做一遍。
背景:使用toplink jpa,存在外部webservice调用 – 内外事务”混搭”的情况
目标:将事务定义为方法级别(每个service方法都是独立一个事务,并提交),外部调用不置入事务
方法:
1.spring 事务aop配置
–要点:配置propagation为require_new,同时隔离级别设置为READ_COMMITTED – 只可读提交,不可脏读;ABCService中的所有方法配置为非事务 – propagation为NEVER(这样在执行时会报IllegalStateTransaction异常,并不会影响),或者这里外部调用也是用requirenew。;
<tx:advice id=”txAdvice” transaction-manager=”entityTransactionManager”>
<tx:attributes>
<tx:method name=”get*” read-only=”true” />
<tx:method name=”find*” read-only=”true” />
<tx:method name=”save*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”create*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”confirm*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”redirect*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”receive*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”delete*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”update*(..)” propagation=”REQUIRES_NEW” isolation=”READ_COMMITTED” read-only=”false” rollback-for=”java.lang.Exception”/>
<tx:method name=”*” propagation=”REQUIRES_NEW” rollback-for=”java.lang.Exception”/>
</tx:attributes>
</tx:advice>
<tx:advice id=”noTxAdvice” transaction-manager=”entityTransactionManager”>
<tx:attributes>
<tx:method name=”*” propagation=”NEVER” rollback-for=”java.lang.Exception”/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor
pointcut=”execution(* com.modofo.domain.service..*.*(..))”
advice-ref=”txAdvice”  />
<aop:advisor
pointcut=”execution(* com.modofo.domain.service..ABCService*.*(..))”
advice-ref=”noTxAdvice”  />
</aop:config>

2.调用时在controller中控制内外事务的异常处理,并做相应的补偿操作。会使controller(调用端)变的复杂。但也没有想到更好的方法。

潜在问题:
1.读提交(read_committed)

Comments are closed.