MyBatis源码解析之Transaction事务模块

yizhihongxing

MyBatis源码解析之Transaction事务模块

一、概述

MyBatis是一款优秀的持久层框架,它支持事务控制,能够帮助开发者方便地管理数据的事务。MyBatis的事务管理模块主要由Transaction接口、TransactionFactory接口、TransactionIsolationLevel枚举和JdbcTransaction、ManagedTransaction两个类实现。

二、Transaction接口

Transaction接口定义了事务的基本方法,包括提交事务、回滚事务和关闭事务。一个SqlSessionFactory实例可以创建一个Transaction实例。

public interface Transaction {
    void commit() throws SQLException;

    void rollback() throws SQLException;

    void close() throws SQLException;

    Integer getTimeout() throws SQLException;
}

三、TransactionFactory接口

TransactionFactory接口定义了创建Transaction实例的方法。

public interface TransactionFactory {
    Transaction newTransaction(Connection conn);
    /**
     * @since 3.1.0
     */
    Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);
    void setProperties(Properties props);
}

四、TransactionIsolationLevel枚举

TransactionIsolationLevel枚举定义了事务的隔离级别,包括NONE、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。

五、JdbcTransaction类

JdbcTransaction继承自BaseTransaction类,是基于JDBC实现的事务管理器。它的创建依赖于TransactionFactory实例。在JdbcTransaction对象创建的过程中,如果autoCommit为false,则将会开启事务。

示例代码:

public class JdbcTransaction extends BaseTransaction {

    public JdbcTransaction(Connection connection) {
        delegate = new JdbcTransactionImpl(connection);
    }

    public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
        Connection conn;
        try {
            conn = ds.getConnection();
            if (conn.getAutoCommit() != desiredAutoCommit) {
                conn.setAutoCommit(desiredAutoCommit);
            }
            delegate = new JdbcTransactionImpl(conn);
        } catch (SQLException e) {
            throw new TransactionException("Error initializing JDBC Connection.  Cause: " + e, e);
        }
    }

    private static class JdbcTransactionImpl extends BaseTransactionState implements TransactionState {
        private Connection connection;
        private TransactionIsolationLevel level;
        private boolean autoCommmit;

        public JdbcTransactionImpl(Connection connection) {
            this.connection = connection;
            try {
                this.level = TransactionIsolationLevel.fromValue(connection.getTransactionIsolation());
                this.autoCommmit = connection.getAutoCommit();
            } catch (SQLException e) {
                throw new TransactionException("Error configuring Transaction.  Cause: " + e, e);
            }
        }

        public void commit() throws SQLException {
            if (connection != null && !connection.isClosed()) {
                if (autoCommmit != connection.getAutoCommit()) {
                    connection.setAutoCommit(autoCommmit);
                }
                connection.commit();
            }
        }

        public void rollback() throws SQLException {
            if (connection != null && !connection.isClosed()) {
                if (autoCommmit != connection.getAutoCommit()) {
                    connection.setAutoCommit(autoCommmit);
                }
                connection.rollback();
            }
        }

        public void close() throws SQLException {
            connection.close();
        }

        public Integer getTimeout() throws SQLException {
            return null;
        }
    }

}

六、ManagedTransaction类

ManagedTransaction类也继承自BaseTransaction类,是基于容器环境下的事务管理器,它不会commit和rollback事务,而是依赖容器(如Spring)来完成这些操作。也就是说,它将交给上层容器来管理事务。

示例代码:

public class ManagedTransaction extends BaseTransaction {

    private Connection connection;
    private TransactionIsolationLevel level;
    private boolean closeConnection;

    public ManagedTransaction(Connection connection, boolean closeConnection) {
        this.connection = connection;
        this.closeConnection = closeConnection;
        this.delegate = new ManagedTransactionImpl(connection);
    }

    public ManagedTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) {
        try {
            Connection conn = dataSource.getConnection();
            if (conn.getAutoCommit() != autoCommit) {
                conn.setAutoCommit(autoCommit);
            }
            this.connection = conn;
            this.level = level;
            this.closeConnection = true;
            this.delegate = new ManagedTransactionImpl(connection);
        } catch (SQLException e) {
            throw new TransactionException("Error getting a connection.  Cause: " + e, e);
        }
    }

    private class ManagedTransactionImpl extends BaseTransactionState implements TransactionState {
        public ManagedTransactionImpl(Connection connection) {
            // Do nothing
        }

        public void commit() throws SQLException {
            // Do nothing
        }

        public void rollback() throws SQLException {
            // Do nothing
        }

        public void close() throws SQLException {
            if (closeConnection && connection != null) {
                connection.close();
            }
        }

        public Integer getTimeout() throws SQLException {
            return null;
        }
    }

}

七、示例说明

示例一:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    // 获取Transaction实例
    Transaction tx = sqlSession.getTransaction();
    // 关闭事务
    tx.close();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    sqlSession.close();
}

示例二:

Transaction transaction = transactionFactory.newTransaction(dataSource, TransactionIsolationLevel.READ_COMMITTED, false);
try {
    // 执行一些数据库操作
    transaction.commit();
} catch (Exception e) {
    transaction.rollback();
} finally {
    transaction.close();
}

八、总结

MyBatis的Transaction事务模块是MyBatis框架的核心模块之一,它为MyBatis应用程序提供了事务管理功能。MyBatis的事务管理模块由Transaction接口、TransactionFactory接口、TransactionIsolationLevel枚举和JdbcTransaction、ManagedTransaction两个类实现,开发者可以根据自己的具体需求进行选择。在实际开发中,我们应该根据项目的实际情况选择合适的事务管理方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis源码解析之Transaction事务模块 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java图书管理系统课程设计

    Java图书管理系统课程设计攻略 一、需求分析 在进行Java图书管理系统课程设计之前,需要对系统需求进行分析和明确。在这个阶段,需要考虑的问题包括: 系统的主要功能模块,如图书信息录入、查询、借阅、归还等等。 系统的用户管理模块,包括管理员和普通用户的不同权限和功能。 系统的数据存储模块,需要设计数据库表结构和关键数据处理逻辑等。 二、设计数据库 根据需求…

    Java 2023年5月24日
    00
  • 用javascript实现div可编辑的常见方法

    使用JavaScript实现DIV可编辑通常有以下几种方法: contentEditable属性 contentEditable属性是HTML5的内容编辑属性,可以将HTML元素设置为可编辑的。我们可以将一个div元素的contentEditable属性设置为true,使其成为可编辑。 HTML代码: <div contenteditable=&quo…

    Java 2023年6月15日
    00
  • Nginx自定义访问日志的配置方式

    下面详细讲解一下“Nginx自定义访问日志的配置方式”的完整攻略,具体步骤如下: 1. 确认Nginx的日志模块是否已经安装 在开始配置之前,我们需要确保本机上已经安装了Nginx的日志模块,可以通过以下命令进行确认: nginx -V 2>&1 | grep -o with-http_log_module 如果终端上显示了“with-http…

    Java 2023年6月15日
    00
  • php如何调用webservice应用介绍

    什么是Web Service Web Service是一种基于网络的技术,用于实现不同程序之间的互操作性。Web Service通过标准化的协议和格式,允许应用程序通过HTTP请求进行远程方法调用,以获取和传递数据和服务。PHP是一种流行的编程语言,具有广泛的支持和适合于Web Service调用。下面我们来详细了解如何在PHP中调用Web Service。…

    Java 2023年5月19日
    00
  • MyBatis通用的10种写法总结大全

    MyBatis通用的10种写法总结大全 1. 基础查询 示例1: xml <select id=”selectById” resultType=”com.example.model.User”> select * from user where id = #{id} </select> 示例2: xml <select id=”…

    Java 2023年5月20日
    00
  • Springmvc 4.x利用@ResponseBody返回Json数据的方法

    以下是关于“SpringMVC 4.x利用@ResponseBody返回JSON数据的方法”的完整攻略,其中包含两个示例。 SpringMVC 4.x利用@ResponseBody返回JSON数据的方法 在SpringMVC 4.x中,我们可以使用@ResponseBody注解将Java对象转换为JSON格式的数据,并将其返回给客户端。本文将介绍两个示例,包…

    Java 2023年5月16日
    00
  • 没有杯子的世界:OOP设计思想的应用实践

    最近看到一个有趣的问题:Person类具有Hand,Hand可以操作杯子Cup,但是在石器时代是没有杯子的,这个问题用编程怎么解决? 简单代码实现 我们先用简单代码实现原问题: @Data public class Person { private final String name; private Hand hand = new Hand(); priv…

    Java 2023年4月22日
    00
  • java — 标记接口

    标记接口 标记接口(Marker Interface),又称标签接口(Tag Interface) 仅代表一个标记 不包含任何方法标记接口是用来判断某个类是否具有某种能力 Cloneable标记接口 此类实现了 Cloneable 接口,以指示 Object.clone 方法可以合法地对该类实例进行按字段复制如果在没有实现 Cloneable 接口的实例上调…

    Java 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部