Mybatis事务包分析

上面写的很清楚,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 对事务的管理弱爆了.

建议增加事务的最大执行时间.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值