mybatis基础支持层-事务模块
模块本身相对简单,含有TransactionFactory,Transaction两个接口,及各有两个实现,在最终事务的过程是依靠例如Spring等容器的调度实现的,后续还会继续了解Spring & Mybatis实现事务的过程
一、Transaction
public interface Transaction {
/**
* Retrieve inner database connection.
* @return DataBase connection
* @throws SQLException
* the SQL exception
* 获取连接
*/
Connection getConnection() throws SQLException;
/**
* Commit inner database connection.
* @throws SQLException
* the SQL exception
* 提交事务
*/
void commit() throws SQLException;
/**
* Rollback inner database connection.
* @throws SQLException
* the SQL exception
* 回滚事务
*/
void rollback() throws SQLException;
/**
* Close inner database connection.
* @throws SQLException
* the SQL exception
* 关闭
*/
void close() throws SQLException;
/**
* Get transaction timeout if set.
*
* @return the timeout
* @throws SQLException
* the SQL exception
* 获取超时时间
*/
Integer getTimeout() throws SQLException;
}
1.JdbcTransaction & ManagedTransaction 实现类
- JdbcTransaction 属性
//数据库连接
protected Connection connection;
//数据库 用于获取连接
protected DataSource dataSource;
//隔离级别
protected TransactionIsolationLevel level;
//是否自动提交
protected boolean autoCommit;
- 依靠JDBC connection自身的属性,进行commit rollback
//获取链接
@Override
public Connection getConnection() throws SQLException {
if (connection == null) {
openConnection();
}
return connection;
}
@Override
public void commit() throws SQLException {
if (connection != null && !connection.getAutoCommit()) {
if (log.isDebugEnabled()) {
log.debug("Committing JDBC Connection [" + connection + "]");
}
connection.commit();
}
}
@Override
public void rollback() throws SQLException {
if (connection != null && !connection.getAutoCommit()) {
if (log.isDebugEnabled()) {
log.debug("Rolling back JDBC Connection [" + connection + "]");
}
connection.rollback();
}
}
@Override
public void close() throws SQLException {
if (connection != null) {
resetAutoCommit();
if (log.isDebugEnabled()) {
log.debug("Closing JDBC Connection [" + connection + "]");
}
connection.close();
}
}
...
protected void openConnection() throws SQLException {
if (log.isDebugEnabled()) {
log.debug("Opening JDBC Connection");
}
connection = dataSource.getConnection();
if (level != null) {
connection.setTransactionIsolation(level.getLevel());
}
setDesiredAutoCommit(autoCommit);
}
二、TransactionFactory
- 提供几个方法,主要用于实例化Transaction 并且设置参数
public interface TransactionFactory {
/**
* Sets transaction factory custom properties.
* @param props
* the new properties
* 设置事务参数
*/
default void setProperties(Properties props) {
// NOP
}
/**
* 创建事务
* Creates a {@link Transaction} out of an existing connection.
* @param conn Existing database connection
* @return Transaction
* @since 3.1.0
*/
Transaction newTransaction(Connection conn);
/**
* 创建事务
* Creates a {@link Transaction} out of a datasource.
* @param dataSource DataSource to take the connection from
* @param level Desired isolation level
* @param autoCommit Desired autocommit
* @return Transaction
* @since 3.1.0
*/
Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
}
1. JdbcTransactionFactory & ManagedTransactionFactory
public class JdbcTransactionFactory implements TransactionFactory {
@Override
public Transaction newTransaction(Connection conn) {
return new JdbcTransaction(conn);
}
@Override
public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {
return new JdbcTransaction(ds, level, autoCommit);
}
}