转自
https://blog.csdn.net/luanlouis/article/details/37992171
详细内容看源博客,这里只是总结性的整理知识。
1 概述
对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口
:其接口定义如下:概述对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口
:其接口定义如下:
2 MyBatis的事务管理
分为两种形式:
使用JDBC
的事务管理机制:即利用java.sql.Connection
对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等使用JDBC
的事务管理机制:即利用java.sql.Connection
对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等使用MANAGED
的事务管理机制:这种机制MyBatis自身不会去实现事务管理,而是让程序的容器
如(JBOSS,Weblogic)来实现对事务的管理
3 事务的配置、创建和使用
3.1 事务的配置
我们在使用MyBatis时,一般会在MyBatisXML配置文件中定义类似如下的信息:
< 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有两个对应的实现的子类:如下所示:
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功能不会对事务有任何的影响,它什么都不会做,它将事务管理的权利移交给了容器来实现。