Mybatis通过内部的Transaction和TransactionFactory来管理事务。
本文将探究一番Mybatis事务管理的一些细节。
-
事务(Transaction)
-
Mybatis将事务抽象为Transaction,通过管理内部的JDBC的Connection对象来完成事务管理。
-
Mybatis内部有两个具体的事务实现: JdbcTransaction和ManagedTransaction。
-
JdbcTransaction
-
JdbcTransaction使用JDBC的Connection对象的提交和回滚来管理事务,并通过内部的
DataSource对象来获取Connection对象。
-
而真正创建事务,是通过工厂类JdbcTransactionFactory
-
ManagedTransaction
-
ManagedTransaction本身并不做任何事务管理,其忽略了事务提交回滚的动作,而是交由容器去管理事务。
-
同样ManagedTransaction的创建,是通过ManagedTransactionFactory工厂类
-
SqlSession
-
当使用Mybatis进行数据库操作时,都是通过SqlSession内部的Executor对象来进行CRUD等操作
-
SqlSession由工厂类
SqlSessionFactory创建。
-
SqlSessionFactory有两个实现DefaultSqlSessionFactory和
SqlSessionManager,其回话管理机制有所不同。这里主要看下下DefaultSqlSessionFactory
-
DefaultSqlSessionFactory回话管理
-
DefaultSqlSessionFactory回话创建,
主要是通过数据源获取Connection或直接传入Connection对象,
继而创建Transaction对象,最终构造出Executor对象。
-
数据源管理
-
Mybatis中数据源管理分为三种: UNPOOLED,POOLED,JNDI。
这里着讲述POOLED(基于连接池的数据源)。
-
POOLED别名的类型为PooledDataSource,其内部包装了一个
UnpooledDataSource,当需要真正创建一个JDBC连接时,则委托给该对象去处理。看看PooledDataSource
是如何获取一个JDBC连接的
-
Mybatis将PooledDataSource的状态抽象为PoolState类
-
那么如何PooledDataSource释放连接呢?PooledConnection
对象内部封装了JDBC的Connection,并动态代理了Connection.close方法
-
看看pushConnection()方法