`
tmj_159
  • 浏览: 705846 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

Mybatis 事务源码分析

 
阅读更多

Mybatis是一个支持自定义SQL语句,存储过程,高级映射的数据持久化框架。

 

它封装了JDBC,在框架中隐藏了几乎所有的JDBC的API,这里说下从源码的角度Mybatis 3.x (笔者用的是3.2.8)是如何封装JDBC来实现事务处理的。

 

回忆下mybatis是怎么使用事务管理的,session.commit(),session.rollback(), JDBC呢,是connection.commit(),connection.rollback()。所以这篇文章的内容就变成了如何从session.commit()到connection.commit()。

 

首先从session来看看,我们获得一个session对象其实是DefaultSqlSession对象,这个类中的commit() 方法如下。

 

 public void commit() {
    commit(false);
  }

  public void commit(boolean force) {
    try {
      executor.commit(isCommitOrRollbackRequired(force));
      dirty = false;
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
  }

 private boolean isCommitOrRollbackRequired(boolean force) {
    return (!autoCommit && dirty) || force;
  }

 

 

然后到CachingExecutor 中的方法

 

public void commit(boolean required) throws SQLException {
    delegate.commit(required);
    tcm.commit();
  }

//也许对这执行commit的对象不熟悉,看下面
private Executor delegate;
private TransactionalCacheManager tcm = new TransactionalCacheManager();

 

  所以真正我们关心的事务是另外一个Executor,BaseExecutor中commit()方法

public void commit(boolean required) throws SQLException {
    if (closed) throw new ExecutorException("Cannot commit, transaction is already closed");
    clearLocalCache();
    flushStatements();
    if (required) {
      transaction.commit();
    }
  }

 前面两个方法是跟缓存相关,只有最后一个才是我们关心的,JDBCTransaction类中的commit()

 public void commit() throws SQLException {
    if (connection != null && !connection.getAutoCommit()) {
      if (log.isDebugEnabled()) {
        log.debug("Committing JDBC Connection [" + connection + "]");
      }
      connection.commit();
    }
  }

 现在我们明白了,JDBCTransaction中包装了一个connection的对象。这也是我们在使用mybatis配置文件时设置的事务管理类。

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"> <!--这里-->
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MyBatis源码分析.pdf

    MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...

    mybatis源码分析视频

    本资源“mybatis源码分析视频”是针对MyBatis框架进行深入剖析的教程,通过视频和文档的形式帮助学习者理解其内部工作机制。 1. **MyBatis简介** MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。...

    Mybatis源码分析.pdf

    MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理和优化数据库操作至关重要。MyBatis的核心设计理念是简化SQL操作,通过XML或注解的方式将SQL与Java代码分离,同时提供强大的动态SQL功能。 首先...

    mybatis3.x源码深度解析与最佳实践.pdf

    本系列源码解析的方式将从 MyBatis 的源码入手,深入分析 MyBatis 的设计思路和实现机制。 2. 容器的加载与初始化 2.1 config 文件解析 XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,...

    mybatis源码分析思维导图.rar

    MyBatis的源码分析对于理解其工作原理、优化数据库交互以及进行二次开发至关重要。通过思维导图的方式,我们可以更直观、系统地理解MyBatis的架构和流程。 首先,MyBatis的核心概念包括SqlSessionFactory、...

    mybatis基础源码及jar包

    - 分析MyBatis的源码,了解其内部实现机制,如如何解析XML配置文件,如何生成动态代理等。 - 学习如何配置MyBatis环境,包括设置数据源、创建SqlSessionFactory等。 - 熟悉Mapper接口和XML映射文件的编写,理解SQL与...

    mybatis源码分析

    通过对MyBatis源码的分析,开发者可以更深入地理解其内部运作机制,从而更好地优化应用,解决实际问题。同时,这也是一种提升个人技术水平和解决问题能力的有效途径。在阅读源码过程中,可能会遇到各种设计模式和...

    mybatis3 源码

    源码分析有助于理解MyBatis如何根据结果集和结果映射配置创建目标对象。 8. **TypeHandler** TypeHandler是MyBatis中处理Java类型和JDBC类型之间转换的关键组件。通过自定义TypeHandler,我们可以实现对特殊类型的...

    mybatis-3.2.2-src.rar 源码

    源码分析可以从以下几个主要方面展开: 1. **架构设计**:Mybatis 的核心组件包括SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Executor等。SqlSessionFactoryBuilder用于创建SqlSessionFactory,它...

    mybatis实战源码

    - MyBatis提供了一个强大的插件机制,用户可以自定义拦截器实现SQL执行前后的增强功能,如日志、性能分析等。 7. MyBatis的Spring整合 - MyBatis与Spring整合后,可以使用Spring的事务管理,简化了事务控制和依赖...

    mybatis-3.4.1源码

    通过对MyBatis 3.4.1源码的阅读和分析,开发者可以掌握MyBatis的内部工作流程,了解如何编写更高效、更灵活的数据访问代码。同时,对于想要深入持久层框架开发或者定制MyBatis功能的人来说,源码学习是必不可少的。

    源码分析专题之Mybatis课程一之源码分析与实现.pdf

    综上所述,Mybatis源码分析涵盖了大量的知识点,包括设计思想、架构组件、缓存机制、事务处理以及与Spring的整合等。通过深入源码的学习,开发者能够更加精准地掌握Mybatis的内部机制,以及如何在实际项目中高效地...

    mybatis项目源码

    通过分析这些源码,初学者不仅可以理解MyBatis的基本工作流程,还能深入学习到Java编程、反射、AOP(面向切面编程)等相关知识。同时,这也有助于掌握实际项目中如何优雅地集成MyBatis,提升数据库操作的灵活性和...

    mybatis3源码

    MyBatis3是一款著名的Java持久层框架,它简化了数据库操作并与对象...通过对MyBatis3源码的深入理解和分析,我们可以更高效地利用其特性,提高开发效率,同时也能了解其内部的工作原理,有助于解决实际问题和优化性能。

    mybatis-plus源码

    在深入探讨MyBatis-Plus源码之前,我们先了解一下MyBatis-Plus的基本概念和作用。 MyBatis-Plus是对MyBatis框架的一种增强,它在MyBatis的基础上进行了功能扩展,比如自动填充字段、条件构造器、一键生成代码等,极...

    mybatis-3-mybatis-3.4.5 源码

    在深入分析MyBatis 3.4.5源码之前,我们先理解一下框架的核心概念: 1. **SqlSessionFactory**: 是MyBatis的核心,它是一个工厂类,用于创建SqlSession对象。SqlSessionFactory由SqlSessionFactoryBuilder通过读取...

    mybatis源码.rar

    源码分析是理解框架工作原理的重要途径,通过阅读MyBatis的源码,我们可以深入学习其内部机制,包括SQL动态生成、结果映射、事务管理等方面。 1. SQL动态生成:MyBatis的核心之一是SQL动态语句。在XML配置文件或...

    myBatis3.2.2带源码和文档

    2. **源码分析** `mybatis-3.2.2-sources.jar` 包含了MyBatis的源代码,开发者可以通过阅读源码了解MyBatis内部的工作原理,如SqlSession、Executor、Mapper接口等核心组件的实现,以及动态SQL的处理方式。这对于...

    MyBatis源码详解学习.zip

    源码分析时,会了解到SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等关键类的作用,它们构成了MyBatis的主要工作流程。 SqlSessionFactoryBuilder用于构建SqlSessionFactory,这是MyBatis的核心工厂,...

Global site tag (gtag.js) - Google Analytics