Mybatis 事务包分析
程序员文章站
2022-03-07 19:06:06
...
上面写的很清楚,Transaction 是对 database connection 的封装,处理 connection 的生命周期.
创建、准备、提交、回滚和关闭.
public interface Transaction {
/**
* Retrieve inner database connection.
* @return DataBase connection
* @throws SQLException
*/
Connection getConnection() throws SQLException;
/**
* Commit inner database connection.
* @throws SQLException
*/
void commit() throws SQLException;
/**
* Rollback inner database connection.
* @throws SQLException
*/
void rollback() throws SQLException;
/**
* Close inner database connection.
* @throws SQLException
*/
void close() throws SQLException;
/**
* Get transaction timeout if set.
* @throws SQLException
*/
Integer getTimeout() throws SQLException;
}
TransactionFactory 创建事务的工厂.
public interface TransactionFactory {
/**
* Sets transaction factory custom properties.
* @param props
*/
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);
}
TransactionException 对事务异常的封装.
我们先看对 JDBC 的封装.
JdbcTransactionFactory 很简单,就是返回一个 JdbcTransaction 的实例.
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);
}
}
看了下 JdbcTransaction 类,发现它就是对 connection 的一层浅浅的封装. 底层的实现还是要靠 connection 来实现. 但是有问题,无法设置事务开启的时长. 比如说一个 sql 执行 10s 还没执行完,它不能返回并抛出异常.
ManagedTransaction 事务是说 Mybatis 自己不实现事务,而是让容器,例如 JBoss 来实现对事务的管理.
所以我们看到的 ManagedTransaction 的 commit/rollback 方法体都是空的.
ManagedTransactionFactory 就是返回 ManagedTransaction 的一个工厂.
看完 Mybatis 的事务包,最大的感触是 Mybatis 对事务的管理弱爆了.
建议增加事务的最大执行时间.
创建、准备、提交、回滚和关闭.
public interface Transaction {
/**
* Retrieve inner database connection.
* @return DataBase connection
* @throws SQLException
*/
Connection getConnection() throws SQLException;
/**
* Commit inner database connection.
* @throws SQLException
*/
void commit() throws SQLException;
/**
* Rollback inner database connection.
* @throws SQLException
*/
void rollback() throws SQLException;
/**
* Close inner database connection.
* @throws SQLException
*/
void close() throws SQLException;
/**
* Get transaction timeout if set.
* @throws SQLException
*/
Integer getTimeout() throws SQLException;
}
TransactionFactory 创建事务的工厂.
public interface TransactionFactory {
/**
* Sets transaction factory custom properties.
* @param props
*/
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);
}
TransactionException 对事务异常的封装.
我们先看对 JDBC 的封装.
JdbcTransactionFactory 很简单,就是返回一个 JdbcTransaction 的实例.
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);
}
}
看了下 JdbcTransaction 类,发现它就是对 connection 的一层浅浅的封装. 底层的实现还是要靠 connection 来实现. 但是有问题,无法设置事务开启的时长. 比如说一个 sql 执行 10s 还没执行完,它不能返回并抛出异常.
ManagedTransaction 事务是说 Mybatis 自己不实现事务,而是让容器,例如 JBoss 来实现对事务的管理.
所以我们看到的 ManagedTransaction 的 commit/rollback 方法体都是空的.
ManagedTransactionFactory 就是返回 ManagedTransaction 的一个工厂.
看完 Mybatis 的事务包,最大的感触是 Mybatis 对事务的管理弱爆了.
建议增加事务的最大执行时间.