《深入理解mybatis原理》 MyBatis事务管理机制

转自
https://blog.csdn.net/luanlouis/article/details/37992171

详细内容看源博客,这里只是总结性的整理知识。

1 概述

对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:其接口定义如下:概述对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:其接口定义如下:
《深入理解mybatis原理》 MyBatis事务管理机制

2 MyBatis的事务管理分为两种形式:

  1. 使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等
  2. 使用MANAGED的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理
    《深入理解mybatis原理》 MyBatis事务管理机制

3 事务的配置、创建和使用

3.1 事务的配置

我们在使用MyBatis时,一般会在MyBatisXML配置文件中定义类似如下的信息:
《深入理解mybatis原理》 MyBatis事务管理机制
< environment>节点定义了连接某个数据库的信息,其子节点< transactionManager> 的type 会决定我们用什么类型的事务管理机制。

3.2 TransactionFactory 事务工厂的创建

MyBatis事务的创建是交给TransactionFactory 事务工厂来创建的,如果我们将< transactionManager>的type 配置为"JDBC",那么,在MyBatis初始化解析< environment>节点时,会根据type="JDBC"创建一个JdbcTransactionFactory工厂实例。

MyBatis对< transactionManager>节点的解析会生成 TransactionFactory实例;而对< dataSource>解析会生成datasouce实例(关于dataSource的解析和原理,读者可以参照我的另一篇博文:《深入理解mybatis原理》 Mybatis数据源与连接池
),作为< environment>节点,会根据TransactionFactory和DataSource实例创建一个Environment对象。Environment表示着一个数据库的连接,生成后的Environment对象会被设置到Configuration实例中,以供后续的使用。

3.3 事务工厂TransactionFactory

事务工厂Transaction定义了创建Transaction的两个方法:一个是通过指定的Connection对象创建Transaction,另外是通过数据源DataSource来创建Transaction。与JDBCTransaction 和MANAGEDTransaction两种Transaction相对应,TransactionFactory有两个对应的实现的子类:如下所示:
《深入理解mybatis原理》 MyBatis事务管理机制

3.4 事务Transaction的创建

通过事务工厂TransactionFactory很容易获取到Transaction对象实例。JdbcTransactionFactory会创建JDBC类型的Transaction,即JdbcTransaction。类似地,ManagedTransactionFactory也会创建ManagedTransaction。

3.4.1 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实现的。

3.4.2 ManagedTransaction管理事物

ManagedTransaction让容器来管理事务Transaction的整个生命周期,意思就是说,使用ManagedTransaction的commit和rollback功能不会对事务有任何的影响,它什么都不会做,它将事务管理的权利移交给了容器来实现。