亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring超詳細(xì)講解事務(wù)和事務(wù)傳播機(jī)制

 更新時(shí)間:2022年06月20日 10:57:38   作者:亞太地區(qū)百大最帥面孔第101名  
Spring事務(wù)的本質(zhì)就是對(duì)數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實(shí)現(xiàn)都是由數(shù)據(jù)庫自己實(shí)現(xiàn)的,Spring會(huì)在事務(wù)開始時(shí),根據(jù)當(dāng)前設(shè)置的隔離級(jí)別,調(diào)整數(shù)據(jù)庫的隔離級(jí)別,由此保持一致

為什么需要事務(wù)

事務(wù)是將一組操作封裝成一個(gè)執(zhí)行單元,要么全部成功,要么全部失敗。如果沒有事務(wù),轉(zhuǎn)賬操作就會(huì)出現(xiàn)異常,因此需要保證原子性。

Spring 聲明事務(wù)

  • 只需要在方法上添加@Transactional注解就可以實(shí)現(xiàn),無需手動(dòng)開啟和提交事務(wù),如果中途發(fā)生異常就會(huì)自動(dòng)回滾事務(wù)。
  • @Transactional既可以修飾方法也可以修飾類,修飾方法只能修飾public方法
  • 注意:@Transactional在異常被捕獲的情況下,事務(wù)就不會(huì)自動(dòng)回滾
@Transactional(isolation = Isolation.READ_COMMITTED) // 開啟事務(wù)
    @RequestMapping("/insert")
    public int insert(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        return userService.add(userInfo);
    }
    @Transactional(isolation = Isolation.READ_COMMITTED) // 開啟事務(wù)
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        int num = 10/0;
        return result;
    }

Transactional參數(shù)說明

propagation

事務(wù)的傳播行為,默認(rèn)為Propagation.REQUIRED

isolation

Spring有5種隔離級(jí)別,MySQL有四種隔離級(jí)別,Spring多了一個(gè)DEFAULT,以連接的數(shù)據(jù)庫的事務(wù)隔離級(jí)別為主

timeout

表示事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1,如果事務(wù)執(zhí)行時(shí)間超過超時(shí)時(shí)間,就會(huì)自動(dòng)回滾

事務(wù)回滾失效解決方案

直接拋出異常

    @Transactional(propagation = Propagation.REQUIRED) // 開啟事務(wù)
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            throw e;//解決事務(wù)失效的問題
           // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

在catch中使用代碼手動(dòng)進(jìn)行事務(wù)的回滾操作

      @Transactional(propagation = Propagation.REQUIRED) // 開啟事務(wù)
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影響的行數(shù):"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            //throw e;//解決事務(wù)失效的問題
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

@Transactional工作原理

@Transactional是基于AOP實(shí)現(xiàn)的,AOP又是使用動(dòng)態(tài)代理實(shí)現(xiàn)的。如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,默認(rèn)情況下會(huì)采用JDK的動(dòng)態(tài)代理,如果目標(biāo)對(duì)象沒有實(shí)現(xiàn)了接口,會(huì)使用CGLIB動(dòng)態(tài)代理。

@Transactional在開始執(zhí)行業(yè)務(wù)之前,通過代理先開啟事務(wù),在執(zhí)行成功之后再提交事務(wù)。如果中途遇到了異常,則回滾事務(wù)。

Spring 事務(wù)的傳播機(jī)制

定義:Spring中多個(gè)事務(wù)相互調(diào)用時(shí),他們之間的行為方式是如何執(zhí)行的

為什么需要事務(wù)傳播機(jī)制?

事務(wù)的隔離級(jí)別是保證多個(gè)并發(fā)事務(wù)執(zhí)行的可控性(穩(wěn)定性),而事務(wù)傳播機(jī)制是保證一個(gè)事務(wù)在多個(gè)調(diào)用方法間的可控性

傳播機(jī)制的類型

嵌套事務(wù)和加入事務(wù)的區(qū)別

  • 整個(gè)事務(wù)如果全部執(zhí)行成功,二者的結(jié)果是一樣的
  • 如果事務(wù)執(zhí)行到一半失敗了,那么加入事務(wù)整個(gè)事務(wù)會(huì)全部回滾;而嵌套事務(wù)會(huì)局部回滾,不會(huì)影響上一個(gè)方法中執(zhí)行的結(jié)果

到此這篇關(guān)于Spring超詳細(xì)講解事務(wù)和事務(wù)傳播機(jī)制的文章就介紹到這了,更多相關(guān)Spring事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論