Spring事務(wù)

先說結(jié)論:Spring事務(wù)異?;貪L,捕獲異常不拋出就不會回滾。
最近遇到了事務(wù)不回滾的情況,我還考慮說JPA的事務(wù)有bug? 我想多了.......
為了打印清楚日志,很多方法我都加tyr catch,在catch中打印日志。但是這邊情況來了,當(dāng)這個方法異常時候 日志是打印了,但是加的事務(wù)卻沒有回滾。
例:
類似這樣的方法不會回滾 (一個方法出錯,另一個方法不會回滾) :

if(userSave){        
    try {       
        userDao.save(user);        
        userCapabilityQuotaDao.save(capabilityQuota);       
     } catch (Exception e) {        
        logger.info("能力開通接口,開戶異常,異常信息:"+e);       
     }       
 }

下面的方法回滾(一個方法出錯,另一個方法會回滾):

if(userSave){       
     try {        
        userDao.save(user);        
        userCapabilityQuotaDao.save(capabilityQuota);       
       } catch (Exception e) {       
        logger.info("能力開通接口,開戶異常,異常信息:"+e);        
        throw new RuntimeException();       
     }        
}

或者:


if(userSave){        
    try {        
        userDao.save(user);        
        userCapabilityQuotaDao.save(capabilityQuota);        
    } catch (Exception e) {        
        logger.info("能力開通接口,開戶異常,異常信息:"+e);        
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();       
    }       
 }

為什么不會滾呢??是對Spring的事務(wù)機(jī)制就不明白。?。?br> 默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的 runtimeexcetpion時才回滾。
spring aop 異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進(jìn)行回滾,默認(rèn)情況下aop只捕獲runtimeexception的異常,但可以通過 。
配置來捕獲特定的異常并回滾 ;
換句話說在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),這樣程序異常時才能被aop捕獲進(jìn)而回滾.
解決方案:
方案1.例如service層處理事務(wù),那么service中的方法中不做異常捕獲,或者在catch語句中最后增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,并且在service上層(webservice客戶端,view層action)要繼續(xù)捕獲這個異常并處理.
方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常(現(xiàn)在項(xiàng)目的做法)

阿里編碼規(guī)約示例:

Severity
   Major

Message
   事務(wù)場景中,拋出異常被catch后,如果需要回滾,一定要手動回滾事務(wù)。

Examples
   
Positive example 1:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    @Transactional(rollbackFor = Exception.class)
    public class UserServiceImpl implements UserService {
        @Override
        public void save(User user) {
            //some code
            //db operation
        }
    }   
Positive example 2:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        @Transactional(rollbackFor = Exception.class)
        public void save(User user) {
            //some code
            //db operation
        }
    }   
Positive example 3:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private DataSourceTransactionManager transactionManager;

        @Override
        @Transactional
        public void save(User user) {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can only be done programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                // execute your business logic here
                //db operation
            } catch (Exception ex) {
                transactionManager.rollback(status);
                throw ex;
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 很多人喜歡這篇文章,特此同步過來 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,904評論 2 59
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,512評論 19 139
  • Spring 事務(wù)屬性分析 事務(wù)管理對于企業(yè)應(yīng)用而言至關(guān)重要。它保證了用戶的每一次操作都是可靠的,即便出現(xiàn)了異常的...
    壹點(diǎn)零閱讀 1,379評論 0 2
  • 在Spring學(xué)習(xí)的書中,AOP最常見的應(yīng)用場景就是事務(wù)管理了?;贏OP的事務(wù)管理是聲明式事務(wù),原理就是在方法的...
    孔垂云閱讀 1,192評論 0 11
  • 搭乘過我車的人幾乎沒人愿意相信我是一名有著十幾年駕齡的“老司機(jī)”。在03年我還是大二學(xué)生的時候,我就按照公安院校的...
    漫舒110閱讀 302評論 0 0

友情鏈接更多精彩內(nèi)容