使用Spring管理事務(wù)過程中,碰到過一些坑,因此也稍微總結(jié)一下,方便后續(xù)查閱。 1.代碼中事務(wù)控制的3種方式
2.事務(wù)不回滾的原因 在工作中,看過別人寫的代碼出現(xiàn)了事務(wù)不回滾的現(xiàn)象。當(dāng)然,事務(wù)不回滾的都是采用的聲明式事務(wù)或者是注解事務(wù);編程式事務(wù)都是自己寫代碼手動(dòng)回滾的,因此是不會(huì)出現(xiàn)不回滾的現(xiàn)象。 再說下聲明式事務(wù)和注解事務(wù)回滾的原理:當(dāng)被切面切中或者是加了注解的方法中拋出了RuntimeException異常時(shí),Spring會(huì)進(jìn)行事務(wù)回滾。默認(rèn)情況下是捕獲到方法的RuntimeException異常,也就是說拋出只要屬于運(yùn)行時(shí)的異常(即RuntimeException及其子類)都能回滾;但當(dāng)拋出一個(gè)不屬于運(yùn)行時(shí)異常時(shí),事務(wù)是不會(huì)回滾的。 下面說說我經(jīng)常見到的3種事務(wù)不回滾的產(chǎn)生原因:
3.如何保證事務(wù)回滾 正常情況下,按照正確的編碼是不會(huì)出現(xiàn)事務(wù)回滾失敗的。下面說幾點(diǎn)保證事務(wù)能回滾的方法
① 聲明式事務(wù),在配置里面添加一個(gè)rollback-for,代碼如下 1 1 <tx:method name='update*' propagation='REQUIRED' rollback-for='java.lang.Exception'/> ② 注解事務(wù),直接在注解上面指定,代碼如下 @Transactional(rollbackFor=Exception.class) 1 1 @Transactional(rollbackFor=Exception.class)
/** TransactionAspectSupport手動(dòng)回滾事務(wù):*/ @Transactional(rollbackFor = { Exception.class }) public boolean test() { try { doDbSomeThing(); } catch (Exception e) { e.printStackTrace(); //就是這一句了, 加上之后拋了異常就能回滾(有這句代碼就不需要再手動(dòng)拋出運(yùn)行時(shí)異常了) TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return false; } return true; } 1 /** TransactionAspectSupport手動(dòng)回滾事務(wù):*/ 2 @Transactional(rollbackFor = { Exception.class }) 3 public boolean test() { 4 try { 5 doDbSomeThing(); 6 } catch (Exception e) { 7 e.printStackTrace(); 8 //就是這一句了, 加上之后拋了異常就能回滾(有這句代碼就不需要再手動(dòng)拋出運(yùn)行時(shí)異常了) 9 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 10 return false; 11 } 12 return true; 13 } |
|