mybatis 事務(wù)回滾配置操作
在mybatis進(jìn)行批量操作的時(shí)候,插入多條數(shù)據(jù)時(shí),設(shè)置回滾但是前面幾條還是插入,經(jīng)過嘗試
問題所在:
官網(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ù)庫的代碼)操作Mybatis Plus的事務(wù),若出現(xiàn)異常進(jìn)入catch之后,不會執(zhí)行數(shù)據(jù)庫操作的回滾,反而會報(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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09淺析java中String類型中“==”與“equal”的區(qū)別
這篇文章主要介紹了淺析java中String類型中“==”與“equal”的區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Springboot Mybatis Plus自動(dòng)生成工具類詳解代碼
mybatis-plus 是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,這篇文章帶你使用Springboot Mybatis Plus自動(dòng)生成工具類2021-11-11java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例
ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來介紹一下java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Springboot解決跨域問題方案總結(jié)(包括Nginx,Gateway網(wǎng)關(guān)等)
跨域問題是瀏覽器為了保護(hù)用戶的信息安全,實(shí)施了同源策略(Same-Origin?Policy),即只允許頁面請求同源(相同協(xié)議、域名和端口)的資源,本文給大家總結(jié)了Springboot解決跨域問題方案包括Nginx,Gateway網(wǎng)關(guān)等),需要的朋友可以參考下2024-03-03