mybatis---事務管理機制
MyBatis作為Java語言的資料庫框架,對資料庫的事務管理是其非常重要的一個方面。本文將講述MyBatis的事務管理的實現機制。首先介紹MyBatis的事務Transaction的介面設計以及其不同實現JdbcTransaction 和 ManagedTransaction;接著,從MyBatis的XML配置檔案入手,講解MyBatis事務工廠的建立和維護,進而闡述了MyBatis事務的建立和使用;最後分析JdbcTransaction和ManagedTransaction的實現和二者的不同特點。
以下是本文的組織結構:
一、概述
對資料庫的事務而言,應該具有以下幾點:建立(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?
- /**
- * 解析<transactionManager>節點,建立對應的TransactionFactory
- * @param context
- * @return
- * @throws Exception
- */
- private TransactionFactory transactionManagerElement(XNode context) throws Exception {
- if (context != null) {
- String type = context.getStringAttribute("type");
- Properties props = context.getChildrenAsProperties();
- /*
- 在Configuration初始化的時候,會通過以下語句,給JDBC和MANAGED對應的工廠類
- typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
- typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
- 下述的resolveClass(type).newInstance()會建立對應的工廠例項
- */
- TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance();
- factory.setProperties(props);
- return factory;
- }
- thrownew BuilderException("Environment declaration requires a TransactionFactory.");
- }
如上述程式碼所示,如果type = "JDBC",則MyBatis會建立一個JdbcTransactionFactory.class 例項;如果type="MANAGED",則MyBatis會建立一個MangedTransactionFactory.class例項。
MyBatis對<transactionManager>節點的解析會生成 TransactionFactory例項;而對<dataSource>解析會生成datasouce例項(關於dataSource的解析和原理,讀者可以參照我的另一篇博文:
[java] view plain copy print?
),作為<environment>節點,會根據TransactionFactory和DataSource例項建立一個Environment物件,程式碼如下所示:
- privatevoid environmentsElement(XNode context) throws Exception {
- if (context != null) {
- if (environment == null) {
- environment = context.getStringAttribute("default");
- }
- for (XNode child : context.getChildren()) {
- String id = child.getStringAttribute("id");
- //是和預設的環境相同時,解析之
- if (isSpecifiedEnvironment(id)) {
- //1.解析<transactionManager>節點,決定建立什麼型別的TransactionFactory
- TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
- //2. 建立dataSource
- DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
- DataSource dataSource = dsFactory.getDataSource();
- //3. 使用了Environment內建的構造器Builder,傳遞id 事務工廠TransactionFactory和資料來源DataSource
- Environment.Builder environmentBuilder = new Environment.Builder(id)
- .transactionFactory(txFactory)
- .dataSource(dataSource);
- configuration.setEnvironment(environmentBuilder.build());
- }
- }
- }
- }
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?
- publicclass JdbcTransactionFactory implements TransactionFactory {
- publicvoid setProperties(Properties props) {
- }
- /**
- * 根據給定的資料庫連線Connection建立Transaction
- * @param conn Existing database connection
- * @return
- */
- public Transaction newTransaction(Connection conn) {
- returnnew JdbcTransaction(conn);
- }
- /**
- * 根據DataSource、隔離級別和是否自動提交建立Transacion
- *
- * @param ds
- * @param level Desired isolation level
- * @param autoCommit Desired autocommit
- * @return
- */
- public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
- returnnew JdbcTransaction(ds, level, autoCommit);
- }
- }
如上說是,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?
- /**
- * @see JdbcTransactionFactory
- */
- /**
- * @author Clinton Begin
- */
- 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