🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
建议指明在当前事务执行的代码中抛出`Exception `时回滚.spring的事务底层机制会捕获所有未处理的`Exception `绝对是否回滚事务. 默认是运行时异常和未检查异常才会回滚,对于检查异常是不会回滚的. 可以配置哪些指定的异常回滚,包括检查异常: ~~~xml <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/> <tx:method name="*"/> </tx:attributes> </tx:advice> ~~~ 也可以指定哪些异常不回滚,下面说明就算遇到未处理的`InstrumentNotFoundException`异常,事务也不回滚,正常提交. ~~~xml <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="updateStock" no-rollback-for="InstrumentNotFoundException"/> <tx:method name="*"/> </tx:attributes> </tx:advice> ~~~ spring的事务决定回滚的规则是越精确的级别越高,如下所有的异常都回滚,除了`InstrumentNotFoundException ` ~~~xml <tx:advice id="txAdvice"> <tx:attributes> <tx:method name="*" rollback-for="Throwable" no-rollback-for="InstrumentNotFoundException"/> </tx:attributes> </tx:advice> ~~~ 也可以在编程中处理回滚,这种代码侵入性太高 ~~~java public void resolvePosition() { try { //业务逻辑 } catch (NoProductInStockException ex) { //触发回滚处理 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } ~~~