mybatis 事務(wù)回滾配置操作
在mybatis進(jìn)行批量操作的時(shí)候,插入多條數(shù)據(jù)時(shí),設(shè)置回滾但是前面幾條還是插入,經(jīng)過(guò)嘗試
問(wèn)題所在:
官網(wǎng)api上openSession(false)就可以回滾了,但是用session.getConnection().getAutoCommit()查看還是true
解決方法:
將DataSource配置改為AutoCommit(false)
將conn設(shè)置setAutoCommit(false),用conn進(jìn)行提交,回滾操作
例子:
SqlSession session = sqlSessionFactory.openSession(false); Connection conn = session.getConnection(); conn.setAutoCommit(false); try { UserMapper mapper = session.getMapper(UserMapper.class); for (String name : names) { //各種操作 User user = new User(); user.setName(name); //插入,需要回滾 mapper.insert(user); } conn.commit(); } catch (Exception e) { //有重復(fù)回滾 conn.rollback(); throw e; } finally { session.close(); }
補(bǔ)充:Spring Boot + Mybatis Plus手動(dòng)觸發(fā)事務(wù)回滾
使用第一種方法(省略了操作數(shù)據(jù)庫(kù)的代碼)操作Mybatis Plus的事務(wù),若出現(xiàn)異常進(jìn)入catch之后,不會(huì)執(zhí)行數(shù)據(jù)庫(kù)操作的回滾,反而會(huì)報(bào)No transaction aspect-managed TransactionStatus in scope的錯(cuò)誤,修改為第二種可以正常進(jìn)行事務(wù)管理和回滾
看到一個(gè)關(guān)于此情況的解釋:
@Transactional 必須觸發(fā)aop代理才能生效,故非public方法,不執(zhí)行事務(wù),public方法在本類中被引用,也不執(zhí)行事務(wù)
第一種方法:
@PostMapping("/save1") public boolean action01() { return action00(); } @PostMapping("/save2") public boolean action02() { return action00(); } @Transactional private boolean action00() { String result = true; try { System.out.println(1/0); } catch (Exception e) { TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); result = false; } return result; }
第二種方法:
@PostMapping("/save1") @Transactional public boolean action01() { boolean result = action00(); if (!result){ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } @PostMapping("/save2") @Transactional public boolean action02() { boolean result = action00(); if (!result){ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return result; } private boolean action00() { String result = true; try { System.out.println(1/0); } catch (Exception e) { result = false; } return result; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
SpringBoot?容器刷新前回調(diào)ApplicationContextInitializer
這篇文章主要為大家介紹了SpringBoot?容器刷新前回調(diào)ApplicationContextInitializer使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Spring啟動(dòng)流程refresh()源碼深入解析
這篇文章主要給大家介紹了關(guān)于Spring啟動(dòng)流程refresh()源碼深入解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09淺析java中String類型中“==”與“equal”的區(qū)別
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Springboot Mybatis Plus自動(dòng)生成工具類詳解代碼
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,這篇文章帶你使用Springboot Mybatis Plus自動(dòng)生成工具類2021-11-11java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例
ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來(lái)介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來(lái)介紹一下java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java之SSM中bean相關(guān)知識(shí)匯總案例講解
這篇文章主要介紹了Java之SSM中bean相關(guān)知識(shí)匯總案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07Springboot解決跨域問(wèn)題方案總結(jié)(包括Nginx,Gateway網(wǎng)關(guān)等)
跨域問(wèn)題是瀏覽器為了保護(hù)用戶的信息安全,實(shí)施了同源策略(Same-Origin?Policy),即只允許頁(yè)面請(qǐng)求同源(相同協(xié)議、域名和端口)的資源,本文給大家總結(jié)了Springboot解決跨域問(wèn)題方案包括Nginx,Gateway網(wǎng)關(guān)等),需要的朋友可以參考下2024-03-03深入理解SpringCloud之Eureka注冊(cè)過(guò)程分析
eureka是一種去中心化的服務(wù)治理應(yīng)用,其顯著特點(diǎn)是既可以作為服務(wù)端又可以作為服務(wù)向自己配置的地址進(jìn)行注冊(cè),這篇文章主要介紹了深入理解SpringCloud之Eureka注冊(cè)過(guò)程分析2018-05-05