專注Java教育13年 全國咨詢/投訴熱線:400-8080-105

                      首頁 hot資訊 MyBatis事務回滾例子

                      MyBatis事務回滾例子

                      更新時間:2022-03-23 10:10 來源:動力節點 瀏覽27次

                      mybatis批量操作中,插入多條數據時,設置回滾,但是之前的幾條還是插入的。嘗試后

                      問題是:

                      官網api上的openSession(false)可以回滾,但是用session查看還是可以的。獲取連接()。獲取自動提交 ()

                      解決方案:

                      將 DataSource 配置更改為 AutoCommit (false)

                      設置setAutoCommit(false)為conn,用conn提交和回滾

                      例子:

                      SqlSession session = sqlSessionFactory.openSession(false);
                        Connection conn = session.getConnection();
                        conn.setAutoCommit(false);
                        try {
                         UserMapper mapper = session.getMapper(UserMapper.class);
                         for (String name : names) {
                           // Various operations 
                          User user = new User();
                          user.setName(name);
                          // Insert, require rollback 
                          mapper.insert(user);
                         }
                         conn.commit();
                        } catch (Exception e) {
                         // There are repeated rollbacks 
                         conn.rollback();
                         throw e;
                        } finally {
                         session.close();
                        }

                      補充:Spring Boot + Mybatis Plus 手動觸發事務回滾

                      使用第一種方法(省略數據庫操作的代碼)操作Mybatis Plus的事務,如果有異常進入catch,數據庫操作不會回滾,但是會報No transaction aspect-managed TransactionStatus in scope的錯誤改為報告。修改為第二種方法可以正常管理和回滾事務

                      請參閱此情況的說明:

                      @Transactional必須觸發aop代理才能生效,所以非公有方法不執行事務,而公有方法在該類中被引用不執行事務

                      方法一:

                      @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;
                      }

                       

                      提交申請后,顧問老師會電話與您溝通安排學習

                      免費課程推薦 >>
                      技術文檔推薦 >>

                      返回頂部
                      美人妻无套按摩中出视频