1. 程式人生 > >專案開發-iBatis事務原始碼之事務提交和回滾

專案開發-iBatis事務原始碼之事務提交和回滾

    類似startTransaction,都是轉發給SqlMapExecutorDelegate的endTransaction。

  /**
   * End the transaction on a session
   *
   * @param sessionScope - the session
   * @throws SQLException - if the transaction could not be ended
   */
  public void endTransaction(SessionScope sessionScope) throws SQLException {
    try {
      try {
        sqlExecutor.cleanup(sessionScope);
      } finally {
        txManager.end(sessionScope);
      }
    } catch (TransactionException e) {
      throw new NestedSQLException("Error while ending transaction.  Cause: " + e, e);
    }
  }
   TransactionManager的end
  public void end(SessionScope sessionScope) throws SQLException, TransactionException {
    Transaction trans = sessionScope.getTransaction();
    TransactionState state = sessionScope.getTransactionState();

    if (state == TransactionState.STATE_USER_PROVIDED) {
      throw new TransactionException("TransactionManager could not end this transaction.  " +
          "A user provided connection is currently being used by this session.  " +
          "You must call the rollback() method of the Connection directly.  " +
          "The calling .setUserConnection (null) will clear the user provided transaction.");
    }

    try {
      if (trans != null) {
        try {
          if (state != TransactionState.STATE_COMMITTED) {
            if (sessionScope.isCommitRequired() || config.isForceCommit()) {
              trans.rollback();
              sessionScope.setCommitRequired(false);
            }
          }
        } finally {
          sessionScope.closePreparedStatements();
          trans.close();
        }
      }
    } finally {
      sessionScope.setTransaction(null);
      sessionScope.setTransactionState(TransactionState.STATE_ENDED);
    }
  }

      事務的提交操作會根據當前SessionScope的事務資訊判斷是否需要回滾,只有當前事務狀態為非提交狀態,同時,提交標識為真時,才會呼叫Transaction的rollback操作。在兩種情況下會出現SQL的回滾:

      第一種,在MappedStatement的executeUpdate操作中,會設定事務的提交標識為真,並且只有在正確執行完成SQL後才會設定事務狀態為已提交狀態。如果整個流程中出現異常,那麼這條SQL就會回滾。

      第二種,使用者執行了startTransaction,但是沒有呼叫commitTransaction方法,那麼這期間的SQL都會回滾。

      Finally分支中會關閉所有的JDBC語句已經Connection,並設定事務狀態為結束狀態。至此,一次完整的SQL執行結束。

相關推薦

軟體事務記憶體導論(八)提交事件

宣告:本文是《Java虛擬機器併發程式設計》的第六章,感謝華章出版社授權併發程式設計網站釋出此文,禁止以任何形式轉載此文。 提交和回滾事件 Java的try-catch-finally語法結構不但使我們可以安全地處理異常,還能夠在程式丟擲異常時選擇性地執行一些程式碼。同樣地,我們也可以控制程式

專案開發-iBatis事務原始碼事務提交

    類似startTransaction,都是轉發給SqlMapExecutorDelegate的endTransaction。 /** * End the transaction on a session * * @param sessionScope - the sessio

(MYSQL學習筆記4)事務的開啟、提交

mysql 事務 使用事務要註意以下三點:1、在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。2、事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要麽全部執行,要麽全部不執行。3、事務用來管理 insert,update,delete 語句MYSQL 事務處理

Spring如何設定讓事務自動提交?Spring兩種事務管理方式的配置及使用

1,我們要明確,Spring如何設定讓事務自動提交和回滾?        ①如何自動提交?           理論上,可以通過對DataSource如下設定,讓事務自動提交 <!-- 配置資料來源 --> <beanid="dataSour

專案開發-iBatis事務結構

       閱讀iBatis原始碼時,對事務相關的程式碼,沒太關注,導致今天專案技術演練時對同事的疑問,解釋不清楚。自己都不清楚的東西,怎麼可能向別人解釋清楚呢?所以,就乾脆繼續看iBatis原始碼,完整跟蹤事務的處理流程。重新分析程式碼,發現iBatis原來使用了代理模

Spring事務實現原始碼事務實現以及Connection的繫結與獲取

PlatformTransactionManager是spring事務的高階抽象,事務的實現需要藉助PlatformTransactionManager完成,該管理主要方法如下: 當我們在使用事務的時候,需要呼叫如下方法獲取一個事務狀態物件。 TransactionS

RocketMQ源碼分析RocketMQ事務消息實現原下篇(事務提交)

ext back mes 分享 lba term 是否一致 return gof 本文將重點分析RocketMQ Broker如何處理事務消息提交、回滾命令,根據前面的介紹,其入口EndTransactionProcessor#proce***equest: Operati

Spring原始碼事務(一)— TransactionAutoConfiguration自動配置

#### 總結: - 在ConfigurationClassParser#parse()中會對deferredImportSelectorHandler進行處理(在處理@ComponentScan 自己所寫@Component的類後) - 處理過程中會呼叫SpringFactoriesLoader#loadF

切分大任務成多個子任務(事務),匯總後統一提交

batch target math frame 調用示例 turn exceptio rri action 示例代碼可以從github上獲取 https://github.com/git-simm/simm-framework.git 一、業務場景:   系統中存在一個盤庫

spring管理事務屬性事務4種隔離級別 理解事務的4種隔離級別

理解事務的4種隔離級別 資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述

Jdbc操作事務提交)----以銀行轉賬為例

以銀行轉賬為例----Jdbc操作事務(提交、回滾) private Statement statement; private Connection conn; @Test public void test01() throws Exception { Class.forName("c

c語言mysql資料庫事務開始、提交範例

1、 事務提交模式修改:修改資料庫提交模式為0[手動提交] memset ( sql, 0x00, sizeof( sql ) ); memcpy ( sql, "set autocommit=0;"

Java中事務提交

import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class RollBack_test {    /**     * @param args     */    public s

c++ mysql事務提交

之前在做有關資料庫的操作時發現,有些內容應該作為一個事務一起提交,而不是每個都單獨提交,這就需要把這些操作當做一個事務來處理。而我之前寫過簡單的資料庫的操作,因為mysql預設的是自動提交,我們就需要用到api——mysql_commit()。     mysql_co

關於spring手動進行事務提交以及的問題。

首先,就我的理解。事務的過程如下:開始事務--------提交/回滾事務。事務就是一系列執行的過程。開始之後,就會執行過程,並且記住過程。這個時候,資料庫中所用的表是被鎖定了的。所以說,如果你只開始了事

spring的事務提交機制

事務超時:@Transactional(timeout = 60)如果用這個註解描述一個方法的話,執行緒已經跑到方法裡面,如果已經過去60秒了還沒跑完這個方法並且執行緒在這個方法中的後面還有涉及到對資料庫的增刪改查操作時會報事務超時錯誤(會回滾)。如果已經過去60秒了還沒跑完

Oracle(二) – 隱式的事務提交動作

Commit, rollback 是顯式的提交和回滾語句,還有一些隱式的提交和回滾是大家需要知道並引起注意的: 當如下事件發生是,會隱式的執行Commit動作: 1 、資料定義語句被執行的時候,比如新建一張表:Create Table … 2 、資料控制語句被執行的時候,

Spring3.1.0實現原理分析(二十二).Dao事務分析事務管理器DataSourceTransactionManager

       大家好,開篇先來談談spring事務的優點吧,即spring事務的存在價值。首先它提供了非侵入式編碼的事務實現,這個是通過aop實現的,具體的實現過程之前也寫部落格分析了。        另外,spring還提供了一套標準的事務管理工作流程。簡單的說,事務管理

JDBC對事務的使用(包括自動提交等知識)

首先得清楚什麼時候使用事務。    當你需要一次執行多條SQL語句時,可以使用事務。通俗一點說,就是,如果這幾條SQL語句全部執行成功,則才對資料庫進行一次更新,如果有一條SQL語句執行失敗,則這幾條SQL語句全部不進行執行,這個時候需要用到事務。    其次才是事務的具體使

如何在mysql下實現事務提交(try&catch)

最近要對資料庫的資料進行一個定時遷移,為了防止在執行過程sql語句因為某些原因報錯而導致資料轉移混亂,因此要對我們的指令碼加以事務