MyBatis 事务源码分析
先来看看在JAVA事务的相关技术,在JAVA中有两类事务,JDBC事务和JTA事务,如果是JDBC类型的事务,则是由Connection类来控制的。如果创建一个Connection对象时,没有显示调用
setTransactionIsolation(int level) 方法,则Connection使用当前数据库默认的事务隔离级别,数据库的默认事务隔离级别可以通过相应的SQL语句进行查询,例如在Mysql数据库下可使用 select @@tx_isolation;语句查看当前数据库的事务隔离级别。
JDBC的Connection类针对事务的隔离性定义了五个隔离级别。
Connection.TRANSACTION_NONE
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
在mybatis中,有一个事务管理器的配置,其中type属性可以配置事务的类型,提供了JDBC或MANAGED的配置属性,这就说明在mybatis中事务的管理方式有两个事务管理器的实现,都是针对JDBC事务的事务管理器(非JTA事务),分别是:
org.apache.ibatis.transaction.jdbc.JdbcTransaction
org.apache.ibatis.transaction.managed.ManagedTransaction
这两个类都实现了org.apache.ibatis.transaction.Transaction接口,Transaction接口定义了如下方法:
Connection getConnection() throws SQLException;void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException;
通过这些方法可以看出这个接口实际是对Connection类进行了包装,包括了Connection的创建、提交、回滚、关闭动作。并且,其中ManagedTransaction类的commit方法和rollback方法中没有做任何事,也就是说这个类是不控制事务的提交和回滚的,而交由外部容器去管理事务的提交与回滚,外部容器(可以是Spring 容器或EJB容器)通过声明式事务的方式进行管事。
在mybatis中,通过一个Enum类org.apache.ibatis.session.TransactionIsolationLevel
来定义了事务的隔离级别:
public enum TransactionIsolationLevel {NONE(Connection.TRANSACTION_NONE),READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);private final int level; private TransactionIsolationLevel(int level) { this.level = level; } public int getLevel() { return level; } }
TransactionIsolationLevel类中定义的事务隔离级别其实就是引用了Connection类中的事务隔离级别,下面分别对这几种隔离级别进行说明:
TRANSACTION_NONE:表示不支持事务的常量
TRANSACTION_READ_UNCOMMITTED:表示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量
TRANSACTION_READ_COMMITTED:不可重复读和虚读可以发生
TRANSACTION_REPEATABLE_READ:虚读可以发生
TRANSACTION_SERIALIZABLE:指示不可以发生脏读、不可重复读和虚读的常量。
再来理解下什么是脏读、不能重复读、虚读(又叫幻读)
脏读:如果一个事务对数据进行了更新,但事务还没有提交,另一个事务就可以“看到”该事务没有提交的更新结果。这样造成的问题是,如果第一个事务回滚,那么第二个事务在此之前所“看到”的数据就是一笔脏数据。
不可重复读:指同个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的。所以TRANSACTION_READ_COMMITTED是无法避免不可重复读和虚读。
幻读:指同样一个查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。
最后再总结下:mybatis只是对JDBC事务提供了事务管理器的封装,如果想在mybatis中使用JTA事务,需要我们自行实现org.apache.ibatis.transaction.Transaction接口,对此Spring框架提供了解决方案,可能通过mybatis+spring+atomikos的整合来完成。或者采用EJB容器也可以提供JTA事务的支持。
转载于:https://www.cnblogs.com/wl0000-03/p/6443900.html
MyBatis 事务源码分析相关推荐
- 【mybatis源码】 mybatis底层源码分析
[mybatis源码] mybatis底层源码分析 1.测试用例 2.开撸源码 2.1 SqlSessionFactory对象的创建与获取 2.2 获取SqlSession对象 2.3 获取接口的代理 ...
- springboot 事务_原创002 | 搭上SpringBoot事务源码分析专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot事务源码分析的专车 专车问题 为什么 ...
- springboot事务回滚源码_002 | 搭上SpringBoot事务源码分析专车
发车啦,发车啦,上车要求: 点击左上方的"java进阶架构师"进入页面 选择右上角的"置顶公众号"上车 专车介绍 该趟专车是开往Spring Boot事务源码分 ...
- Spring事务源码分析责任链事务链事务不生效
文章目录 前言 带着问题分析源码 事务源码分析 寻找Spring事务源码类 TransactionInterceptor调用栈 分析Spring AOP责任链 分析TransactionInterce ...
- Spring源码分析-Spring事务源码分析
导语 在配置Spring事务管理的时候会用到一个类TransactionInterceptor,从下面的类关系图中可以看到TransactionInterceptor继承了MethodInt ...
- CockroachDB 分布式事务源码分析之 TxnCoordSender
前言 本源码分析假设读者已经了解 CockroachDB 架构和各层设计要点. 理论知识见 CockRoachDB Documentation. TxnCoordSender TxnCoordSend ...
- 12干货!spring整合mybatis底层源码分析
核心代码 1.解析配置类上的@MapperScan("com.liqi.mapper") @Import(MapperScannerRegistrar.class) 会调用Mapp ...
- spring事务源码分析结合mybatis源码(二)
让我们继续上篇,分析下如果有第二个调用进入的过程. 代码部分主要是下面这个: if (isExistingTransaction(transaction)) {return handleExistin ...
- Spring事务源码分析
首先看例子,这例子摘抄自开涛的跟我学spring3. @Test public void testPlatformTransactionManager() { DefaultTransactionDe ...
最新文章
- 解读在校园招聘中人工智能常考的笔试题
- tensorflow详解-tf.nn.conv2d(),tf.nn.max_pool()
- D进制的A+B (20)
- Android是否会因低价打败iPhone
- lambda 序列化_Lambda,会序列化吗?
- Linux Shell 中 > 和 >> 的异同点和应用场景
- python中的下标索引
- Numpy高级操作大全!!!
- Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression
- Autofs自动挂在实现
- Java BigDecimal类
- 39.django的ORM模型
- 若依框架前端Vue项目分析实战
- svg和css3创建环形渐变进度条
- 阿雪的学习记录|【V-Rep】小车动起来,添加视觉、距离传感器
- 如何解决程序员沟通之痛?
- window 下载安装minio
- ROM制作图文教程(详细)
- PubMed文献影响因子怎么显示保姆教程
- css 设置MP4 video视频背景色透明
热门文章
- 【Transformer】Do Vision Transformers See Like Convolutional Neural Networks?
- 线程监视器模型_为什么模型验证如此重要,它与模型监视有何不同
- 借钱,一定要有还钱的素质
- 历史是“混合体”,也是“内幕”:说说《三国大传》
- 《死亡笔记》等书遭禁 北京全市封杀“鬼故事”
- java js引擎,Java8 Nashorn JavaScript引擎
- c++设置单元格填充色_格式函数text,设置自定义格式的万金油
- java rsa_java中RSA加解密的实现
- dateformat 返回类型_SpringBoot返回date日期格式化
- python pandas 行数_Python Pandas:增加最大行数