先来看看在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 事务源码分析相关推荐

  1. 【mybatis源码】 mybatis底层源码分析

    [mybatis源码] mybatis底层源码分析 1.测试用例 2.开撸源码 2.1 SqlSessionFactory对象的创建与获取 2.2 获取SqlSession对象 2.3 获取接口的代理 ...

  2. springboot 事务_原创002 | 搭上SpringBoot事务源码分析专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot事务源码分析的专车 专车问题 为什么 ...

  3. springboot事务回滚源码_002 | 搭上SpringBoot事务源码分析专车

    发车啦,发车啦,上车要求: 点击左上方的"java进阶架构师"进入页面 选择右上角的"置顶公众号"上车 专车介绍 该趟专车是开往Spring Boot事务源码分 ...

  4. Spring事务源码分析责任链事务链事务不生效

    文章目录 前言 带着问题分析源码 事务源码分析 寻找Spring事务源码类 TransactionInterceptor调用栈 分析Spring AOP责任链 分析TransactionInterce ...

  5. Spring源码分析-Spring事务源码分析

    导语      在配置Spring事务管理的时候会用到一个类TransactionInterceptor,从下面的类关系图中可以看到TransactionInterceptor继承了MethodInt ...

  6. CockroachDB 分布式事务源码分析之 TxnCoordSender

    前言 本源码分析假设读者已经了解 CockroachDB 架构和各层设计要点. 理论知识见 CockRoachDB Documentation. TxnCoordSender TxnCoordSend ...

  7. 12干货!spring整合mybatis底层源码分析

    核心代码 1.解析配置类上的@MapperScan("com.liqi.mapper") @Import(MapperScannerRegistrar.class) 会调用Mapp ...

  8. spring事务源码分析结合mybatis源码(二)

    让我们继续上篇,分析下如果有第二个调用进入的过程. 代码部分主要是下面这个: if (isExistingTransaction(transaction)) {return handleExistin ...

  9. Spring事务源码分析

    首先看例子,这例子摘抄自开涛的跟我学spring3. @Test public void testPlatformTransactionManager() { DefaultTransactionDe ...

最新文章

  1. 解读在校园招聘中人工智能常考的笔试题
  2. tensorflow详解-tf.nn.conv2d(),tf.nn.max_pool()
  3. D进制的A+B (20)
  4. Android是否会因低价打败iPhone
  5. lambda 序列化_Lambda,会序列化吗?
  6. Linux Shell 中 > 和 >> 的异同点和应用场景
  7. python中的下标索引
  8. Numpy高级操作大全!!!
  9. Python实现鸢尾花数据集分类问题——基于skearn的LogisticRegression
  10. Autofs自动挂在实现
  11. Java BigDecimal类
  12. 39.django的ORM模型
  13. 若依框架前端Vue项目分析实战
  14. svg和css3创建环形渐变进度条
  15. 阿雪的学习记录|【V-Rep】小车动起来,添加视觉、距离传感器
  16. 如何解决程序员沟通之痛?
  17. window 下载安装minio
  18. ROM制作图文教程(详细)
  19. PubMed文献影响因子怎么显示保姆教程
  20. css 设置MP4 video视频背景色透明

热门文章

  1. 【Transformer】Do Vision Transformers See Like Convolutional Neural Networks?
  2. 线程监视器模型_为什么模型验证如此重要,它与模型监视有何不同
  3. 借钱,一定要有还钱的素质
  4. 历史是“混合体”,也是“内幕”:说说《三国大传》
  5. 《死亡笔记》等书遭禁 北京全市封杀“鬼故事”
  6. java js引擎,Java8 Nashorn JavaScript引擎
  7. c++设置单元格填充色_格式函数text,设置自定义格式的万金油
  8. java rsa_java中RSA加解密的实现
  9. dateformat 返回类型_SpringBoot返回date日期格式化
  10. python pandas 行数_Python Pandas:增加最大行数