Mybatis之事务管理
简介
Mybatis的事务管理分为两种JdbcTransaction,ManagedTransaction。其中JdbcTransaction仅仅是对数据库连接Connection的一个包装、内部管理数据库事务还是调用Connection的提交、回滚等事务操作方法。ManagedTransaction更直接、什么也没有做。直接将事务交给外部容器管理。
Mybatis事务管理相关类结构图
类概览:
类UML图(典型的简单工厂模式来创建Transaction):
- Transaction 封装事务管理方法的接口
- TransactionFactory 抽象事务工厂生产方法
- JdbcTransactionFactory实现TransactionFactory、用于生产JdbcTransaction的工厂类
- ManagedTransactionFactory实现TransactionFactory、用于生产ManagedTransaction的工厂类
- JdbcTransaction实现Transaction、只是对事务进行了一层包装、实际调用数据库连接Connection的事务管理方法
- ManagedTransaction 实现Transaction没有对数据库连接做任何事务处理、交由外部容器管理
源码事务
事务配置
Mybatis中关于事务的配置是通过<transaction type="xx"/>
来指定的。配置如下:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
- type为”JDBC”时、使用JdbcTransaction管理事务。
type为”managed”时、使用ManagedTransaction管理事务(也就是交由外部容器管理)
Mybatis深入之初始化过程 中知道配置文件如何解析的、其中关于事务方面的解析:
private void environmentsElement(XNode context) throws Exception {
//只关注事务部分...
TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
...
}