1. 程式人生 > >mybatis---事務管理機制

mybatis---事務管理機制

 MyBatis作為Java語言的資料庫框架,對資料庫的事務管理是其非常重要的一個方面。本文將講述MyBatis的事務管理的實現機制。首先介紹MyBatis的事務Transaction的介面設計以及其不同實現JdbcTransaction 和 ManagedTransaction;接著,從MyBatis的XML配置檔案入手,講解MyBatis事務工廠的建立和維護,進而闡述了MyBatis事務的建立和使用;最後分析JdbcTransactionManagedTransaction的實現和二者的不同特點。

以下是本文的組織結構:


一、概述

    對資料庫的事務而言,應該具有以下幾點:建立(create)、提交(commit)、回滾(rollback)、關閉(close)。對應地,MyBatis將事務抽象成了Transaction介面:其介面定義如下:

MyBatis的事務管理分為兩種形式:

一、使用JDBC的事務管理機制:即利用java.sql.Connection物件完成對事務的提交(commit())、回滾(rollback())、關閉(close())等

二、使用MANAGED的事務管理機制:這種機制MyBatis自身不會去實現事務管理,而是讓程式的容器如(JBOSS,Weblogic)來實現對事務的管理

這兩者的類圖如下所示:

二、事務的配置、建立和使用

1. 事務的配置

我們在使用MyBatis時,一般會在MyBatisXML配置檔案中定義類似如下的資訊:

<environment>節點定義了連線某個資料庫的資訊,其子節點<transactionManager> 的type 會決定我們用什麼型別的事務管理機制。

2.事務工廠的建立

    MyBatis事務的建立是交給TransactionFactory 事務工廠來建立的,如果我們將<transactionManager>的type 配置為"JDBC",那麼,在MyBatis初始化解析<environment>節點時,會根據type="JDBC"建立一個JdbcTransactionFactory工廠,其原始碼如下:

[java]
 view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /** 
  2.    * 解析<transactionManager>節點,建立對應的TransactionFactory 
  3.    * @param context 
  4.    * @return 
  5.    * @throws Exception 
  6.    */
  7. private TransactionFactory transactionManagerElement(XNode context) throws Exception {  
  8.   if (context != null) {  
  9.     String type = context.getStringAttribute("type");  
  10.     Properties props = context.getChildrenAsProperties();  
  11.     /* 
  12.           在Configuration初始化的時候,會通過以下語句,給JDBC和MANAGED對應的工廠類 
  13.           typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); 
  14.           typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class); 
  15.           下述的resolveClass(type).newInstance()會建立對應的工廠例項 
  16.      */
  17.     TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();  
  18.     factory.setProperties(props);  
  19.     return factory;  
  20.   }  
  21.   thrownew BuilderException("Environment declaration requires a TransactionFactory.");  
  22. }  

    如上述程式碼所示,如果type = "JDBC",則MyBatis會建立一個JdbcTransactionFactory.class 例項;如果type="MANAGED",則MyBatis會建立一個MangedTransactionFactory.class例項。

 MyBatis對<transactionManager>節點的解析會生成 TransactionFactory例項;而對<dataSource>解析會生成datasouce例項(關於dataSource的解析和原理,讀者可以參照我的另一篇博文:  
),作為<environment>節點,會根據TransactionFactory和DataSource例項建立一個Environment物件,程式碼如下所示:

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. privatevoid environmentsElement(XNode context) throws Exception {  
  2.   if (context != null) {  
  3.     if (environment == null) {  
  4.       environment = context.getStringAttribute("default");  
  5.     }  
  6.     for (XNode child : context.getChildren()) {  
  7.       String id = child.getStringAttribute("id");  
  8.       //是和預設的環境相同時,解析之
  9.       if (isSpecifiedEnvironment(id)) {  
  10.         //1.解析<transactionManager>節點,決定建立什麼型別的TransactionFactory
  11.         TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));  
  12.         //2. 建立dataSource
  13.         DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));  
  14.         DataSource dataSource = dsFactory.getDataSource();  
  15.         //3. 使用了Environment內建的構造器Builder,傳遞id 事務工廠TransactionFactory和資料來源DataSource
  16.         Environment.Builder environmentBuilder = new Environment.Builder(id)  
  17.             .transactionFactory(txFactory)  
  18.             .dataSource(dataSource);  
  19.         configuration.setEnvironment(environmentBuilder.build());  
  20.       }  
  21.     }  
  22.   }  
  23. }  

    Environment表示著一個數據庫的連線,生成後的Environment物件會被設定到Configuration例項中,以供後續的使用。

    上述一直在講事務工廠TransactionFactory來建立的Transaction,現在讓我們看一下MyBatis中的TransactionFactory的定義吧。

3. 事務工廠TransactionFactory

    事務工廠Transaction定義了建立Transaction的兩個方法:一個是通過指定的Connection物件建立Transaction,另外是通過資料來源DataSource來建立Transaction。與JDBC 和MANAGED兩種Transaction相對應,TransactionFactory有兩個對應的實現的子類:如下所示:

4. 事務Transaction的建立

          通過事務工廠TransactionFactory很容易獲取到Transaction物件例項。我們以JdbcTransaction為例,看一下JdbcTransactionFactory是怎樣生成JdbcTransaction的,程式碼如下:

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. publicclass JdbcTransactionFactory implements TransactionFactory {  
  2.   publicvoid setProperties(Properties props) {  
  3.   }  
  4.     /** 
  5.      * 根據給定的資料庫連線Connection建立Transaction 
  6.      * @param conn Existing database connection 
  7.      * @return 
  8.      */
  9.   public Transaction newTransaction(Connection conn) {  
  10.     returnnew JdbcTransaction(conn);  
  11.   }  
  12.     /** 
  13.      * 根據DataSource、隔離級別和是否自動提交建立Transacion 
  14.      * 
  15.      * @param ds 
  16.      * @param level Desired isolation level 
  17.      * @param autoCommit Desired autocommit 
  18.      * @return 
  19.      */
  20.   public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {  
  21.     returnnew JdbcTransaction(ds, level, autoCommit);  
  22.   }  
  23. }  

    如上說是,JdbcTransactionFactory會建立JDBC型別的Transaction,即JdbcTransaction。類似地,ManagedTransactionFactory也會建立ManagedTransaction。下面我們會分別深入JdbcTranaction 和ManagedTransaction,看它們到底是怎樣實現事務管理的。

5. JdbcTransaction

    JdbcTransaction直接使用JDBC的提交和回滾事務管理機制 。它依賴與從dataSource中取得的連線connection 來管理transaction 的作用域,connection物件的獲取被延遲到呼叫getConnection()方法。如果autocommit設定為on,開啟狀態的話,它會忽略commit和rollback。

    直觀地講,就是JdbcTransaction是使用的java.sql.Connection 上的commit和rollback功能,JdbcTransaction只是相當於對java.sql.Connection事務處理進行了一次包裝(wrapper),Transaction的事務管理都是通過java.sql.Connection實現的。JdbcTransaction的程式碼實現如下:

[java] view plain copy  print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /** 
  2.  * @see JdbcTransactionFactory 
  3.  */
  4. /** 
  5.  * @author Clinton Begin 
  6.  */
  7. public

    相關推薦

    mybatis事務管理機制詳解

    attribute log builder tween gen 事務管理 getc there spro 1.mybatis事務的配置和使用 mybatis事務有兩種使用方式: (a):使用JDBC的事務管理機制:即使用java.Sql.Connection對象完成對事務的

    mybatis---事務管理機制

     MyBatis作為Java語言的資料庫框架,對資料庫的事務管理是其非常重要的一個方面。本文將講述MyBatis的事務管理的實現機制。首先介紹MyBatis的事務Transaction的介面設計

    MyBatis事務管理機制

    element 成了 logic connect ole sre action mybatis事務 nod MyBatis作為Java語言的數據庫框架,對數據庫的事務管理是其非常重要的一個方面。本文將從事務的分類、配置和實現分析MyBatis的事務管理的實現機制。 MyBa

    SSM in Action——MyBatis事務管理和快取機制

    MyBatis的事務管理 眾所周知,事務的四個特性ACID。永續性、原子性、隔離性以及一致性。 Transaction介面 mybatis的事務設計重點就是Transaction介面,它有兩個實現類,分別是JdbcTransaction和ManagedTrans

    spring,mybatis事務管理配置與@Transactional註解使用[轉]

    exception true throws r.java 存在 隔離 enc prot 底層 spring,mybatis事務管理配置與@Transactional註解使用 概述事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。Sprin

    springboot mybatis 事務管理

    private 測試 love cto frame update 數據源 ren jdbc 本文主要講述springboot提供的聲明式的事務管理機制。 一、一些概念 聲明式的事務管理是基於AOP的,在springboot中可以通過@Transactional註解的方式

    spring,mybatis事務管理配置與@Transactional註解使用

    抽象 classname 初始 for batis 時間限制 自動提交 data second spring,mybatis事務管理配置與@Transactional註解使用 概述事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。Spring

    Mybatis 事務管理

    工廠 height nag 發生 配置 配置文件 pan drive alt mybatis的事務和數據源有著非常密切的聯系。上文講述了mybatis的數據源,本文要講述的便是mybatis的事物 1.事務的分類 我們還是已一段xml配置文件為例 <envir

    深入理解spring的事務管理機制及程式碼實現

    Spring的事務管理機制 Spring事務管理高層抽象主要包括3個介面,Spring的事務主要是由他們共同完成的: PlatformTransactionManager:事務管理器—主要用於平臺相關事務的管理 TransactionDefinition: 事務定義資訊(隔

    Spring事務管理機制入門(一)

    黑馬程式設計師Spring事務管理機制視訊學習筆記,視訊教程的內容用來入門,為了深入掌握,後面會對學習的內容進行原始碼解析、設計思想剖析、事務的本質的探索、對生活和人生的啟示一一道來,爭取做到,學就要學透,不要為了學習而學習。   Spring事務管理機制 主要內容:

    Mybatis事務管理

    一、Mybatis事務概述       對於資料庫事務而言,一般包括以下幾個操作:建立、提交、回滾、關閉。MyBatis把這些抽象為Transaction介面:              &nbs

    Spring整合MyBatis 事務管理

    前言         spring事務管理包含兩種情況,程式設計式事務、宣告式事務。而宣告式事務又包括基於註解@Transactional和tx+aop的方式。那麼本文先分析程式設計式註解事務和基於註解的宣告式事務。 程式設計式事務管理使用TransactionTempla

    [轉]Spring 事務管理機制

    摘要:    一般地,使用者的每次請求都對應一個業務邏輯方法,而一個業務邏輯方法往往包括一系列資料庫原子訪問操作,並且這些資料庫原子訪問操作應該繫結成一個事務來執行。然而,在使用傳統的事務程式設計策略時,程式程式碼必然和具體的事務操作程式碼耦合,而使

    spring,mybatis事務管理 隔離級別與事務傳播

    事務隔離級別 隔離級別是指若干個併發的事務之間的隔離程度。TransactionDefinition 介面中定義了五個表示隔離級別的常量: TransactionDefinition.ISOLATION_DEFAULT:這是預設值,表示使用底層資料庫的預設隔離級別。對大

    Spring事務管理機制的實現原理-動態代理

    之前在做專案中遇到spring無法進行事務代理問題,最後發現是因為沒有寫介面,原因當時明白了,看到這篇文章寫的清楚些,轉過來  我們先來分析一下Spring事務管理機制的實現原理。由於Spring內建AOP預設使用動態代理模式實現,我們就先來分析一下動態代理模式的實現方 法。動態代理模式的核心就在於程

    Spring4的知識應用總結(六)——Spring事務管理機制

    Spring中的事務管理一、事務簡介        事務管理是企業級應用程式開發中必不可少的技術,  用來確保資料的完整性和一致性. 事務就是一系列的動作, 它們被當做一個單獨的工作單元. 這些動作要麼

    什麼時候需要使用事務管理機制? (面試題)

    對資料庫的資料進行批量或連表操作時,為了保證資料的一致性和正確性,我們需要新增事務管理機制進行管理。當對資料庫的資料進行操作失敗時,事務管理可以很好保證所有的資料回滾到原來的資料,如果操作成功,則保證

    SpringBoot+Mybatis事務管理

    一、使用場景   在使用事務管理前,有必要先了解下應用場景。如實際過程中一個購買操作包含多個執行過程:查詢庫存、下單、更新庫存,實際操作時,由於高併發存在,可能到下單結束時,更新庫存出錯,那本次購買操作就是失敗的,其下單結果應該被回滾。這種情況就需要引入事務控制,保證整個操

    springboot+mybatis 事務管理

    之前就調研過基於spring和hibernate的事務管理配置,在專案中需要使用mybatis,所有就測試了一下如何使用,感覺還是比較方便的。記錄如下: 1、如何測試事務? 應用場景是有一個刪除操作,需要刪除多個表的多條記錄,並且要求,要嘛都刪除,要嘛都不刪除。 2、myb

    Mycat原始碼篇 : MyCat事務管理機制分析

    針對MyCat1.5版本,對MyCat的事務管理機制進行簡要分析: 1. MyCat事務管理 1.1 事務開啟 MyCat預設執行SQL不開啟事務,使用事務時需要顯式地開啟。目前支援set autocommit = 0 、 BEGIN 、ST