本篇来聊聊mybatis的事务管理机制,基于mybatis 3.4.6、mybatis-spring 1.3.2。

知识点

  • 什么是事务
  • mybatis反对的事务管理形式
  • mybatis事务管理实现机制
  • spring是如何集成的

什么是事务

学过sql的必定都晓得这个概念,事务在sql中是十分重要的概念。这里做一个简略的介绍。

事务( Transaction)由一次或者屡次基本操作形成,或者说,事务由一条或者多条 SQL 语句形成,事务中的所有操作是一个整体,要么全副执行胜利,要么全副执行失败。它有4个根本的个性,别离是原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability),简称 ACID

1) 原子性

一个事务中的所有 SQL 语句,要么全副执行胜利,要么全副执行失败,不会完结在两头的某个环节。事务在执行过程中产生谬误,会被回滚(Rollback)到事务开始前的状态,就像这个事务素来没有执行过一样。

2) 一致性

在事务开始之前和事务完结当前,数据库的完整性没有被毁坏。这示意写入的数据必须完全符合所有的预设规定,其中蕴含数据的精确度、串联性以及后续数据库能够自发性地实现预约的工作。

3) 隔离性

数据库容许多个并发事务同时对其数据进行读写和批改的能力,隔离性能够避免多个事务并发执行时因为穿插执行而导致数据的不统一。事务隔离分为不同级别,包含读未提交(Read uncommitted)、读提交(read committed)、可反复读(repeatable read)和串行化(Serializable)。

4) 持久性

事务处理完结后,对数据的批改就是永恒的,即使系统故障也不会失落。

mybatis反对的事务管理形式

mybatis目前反对两种形式治理事务

  • 原生jdbc
  • 容器托管

先介绍一下原生jdbc,原生jdbc就是咱们间接在mybatis的配置文件中配置对应的数据库信息,对应的事务相干操作都由mybatis内置的JdbcTransaction来实现,相当于是不依赖于任何容器的,配置形式官网也提到了

这里的 type 填 JDBC 就能够了,须要留神的是如果要用原生 jdbc 形式的,必须通过配置文件来实现,不反对 spring 的配置形式。
再说一下容器托管形式。顾名思义就是将事务操作托管给具体的容器来实现。容器是什么意思?简略的了解,咱们能够认为就是相似于spring这种存在,联合起来就是mybatis将事务的治理实现交给spring来实现,它有一个益处就是能够和容器共用一个数据库连贯,不必两边来各自治理,spring对于mybatis的集成就是本人实现了一个专门的容器托管类来做的。

mybatis事务管理实现机制

mybatis 的事务管理实现比较简单,都在这一块了

这里用到了工厂模式来实现,对于原生的jdbc形式,通过JdbcTransaction来治理

能够看到这里间接用了数据库连贯的提交和回滚操作。
你可能认为托管的实现就是ManagedTransaction,其实并不是。那为什么有这个类,我猜测这里只是提供了样例般的代码,理论预计也是为了兼容mybatis的不同配置。能够看到它并没有做任何事件

对于TransactionFactory,它是依附于Environment中的,mybatis 都是通过Environment来获取对应的TransactionFactory,而后再创立相应的Transaction。这也是为什么咱们能够配置不同环境来配置不同数据库信息来做到环境隔离。
而对于Transaction,它是依附于Executor的,也就是执行器,这个设计也非常容易了解,因为执行器自身就是对数据库做增删改查操作的,事务也放到外面一起治理十分正当。

spring是如何集成的

通过下面的内容,咱们晓得 mybatis 反对事务管理托管给容器解决,而 spring 就是这种形式十分经典实现。因为咱们目前用的大多是 spring 框架,所以咱们在我的项目中用 mybatis 的时候都会引入mybatis-spring这个 jar 包,这个包就是 spring 集成 mybatis 的关键所在,外面波及内容也有不少,但这里只剖析事务管理这一块。
对于mybatis的集成,这里有个很要害的类SqlSessionFactoryBean

能够看到这是一个FactoryBean,就是通过它来获取SqlSessionFactory的,间接看外围逻辑org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory

能够看到这里创立了spring实现的事务管理类SpringManagedTransactionFactory,而后创立了一个Environment设置到Configuration中,这样后续 mybatis 在获取事务的时候获取到的都是SpringManagedTransactionFactory

所有实现都在这个包上面,构造是不是很相熟,就是基于 mybatis 的工厂模式那一套。

总结

mybatis的事务管理实现还是绝对比较简单的,其实咱们平时本人去配置具体的事务管理类也很少,因为如果用的spring,根本不必再本人做什么解决了,然而这个设计还是不错的,间接把相干模块交给容器解决,容器接入也简略。