Mybatis 源码学习(六) Transaction事务模块

mybatis源码解析之基础模块-Transaction MyBatis源码解析之基础模块—Transaction 前文回顾 上一篇,咱们一起学习了Mybatis的DataSource模块相关源码,掌握了三种数据源工厂的逻辑,同时也掌握非池化数据源的连接创建,池化数据源如何从空闲列表获取连接并放到活跃连接列表,及连接的归还到空闲队列的逻辑。 下面跟随笔者的思路,咱们继续学习另一个重要模块——Transaction模块。 核心要点 本篇幅主要讲解Mybatis在事务管理中的考量, 架构设计 Transaction模块所在包路径为org.apache.ibatis.. 阅读详情

看到这里,有点没有看明白mybatis的两种事务类型。网上搜了一下相关文章。

MyBatis源码解析(三)——Transaction事务模块

别人的这篇写的太好,直接转过来吧。

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634151.html

1、回顾

  之前介绍了Environment环境类,这其实是一个单例类,在MyBatis运行开启后只会存在一个唯一的环境实例,虽然我们可以在Configuration配置文件中配置多个环境,但是项目运行中只会存在其中的一个,一般项目会存在开发环境和测试环境、生产环境三大环境,其是否可以设置到配置文件中,在开发时使用开发环境,测试时使用测试环境,正式运营时可以使用生产环境。

  之前还提到Environment类中有三个字段,除了id之外,TransactionFactory和DataSource都是比较复杂的模块,这一次我们介绍Transaction模块(即事务模块)。

2、事务模块

  事务模块位于org.apache.ibatis.transaction包,这个包内的类均是事务相关的类:

复制代码
  org.apache.ibatis.transaction
  -----org.apache.ibatis.transaction.jdbc
  ----------JdbcTransaction.java
  ----------JdbcTransactionFactory.java
  -----org.apache.ibatis.transaction.managed
  ----------ManagedTransaction.java   ----------ManagedTransactionFactory.java   -----Transaction.java   -----TransactionException.java   -----TransactionFactory.java
复制代码

  从上面的类结构中也能看出来,MyBatis的事务模块采用的是工厂模式。

2.1 事务接口

  位于org.apache.ibatis.transaction包的Transaction和TransactionFactory都是接口类。

  Transaction是事务接口,其中定义了四个方法:

      commit()-事务提交

      rollBack()-事务回滚

      close()-关闭数据库连接

      getConnection()-获取数据库连接

  如下代码所示:

复制代码
 1 package org.apache.ibatis.transaction;
 2 import java.sql.Connection;  3 import java.sql.SQLException;  4 /**  5  * 事务,包装了一个Connection, 包含commit,rollback,close方法  6  * 在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”):  7 */  8 public interface Transaction {  9 Connection getConnection() throws SQLException; 10 void commit() throws SQLException; 11 void rollback() throws SQLException; 12 void close() throws SQLException; 13 }
复制代码

  TransactionFactory是事务工厂接口,其中定义了三个方法:

      setProperties(Properties props)-设置属性

      newTransaction(Connection conn)-创建事务实例

      newTransaction(DataSource dataSource,TransactionIsolationLevel level,boolean autoCommit)-创建事务实例

  如下代码所示:

复制代码
 1 package org.apache.ibatis.transaction;
 2 import java.sql.Connection;  3 import java.util.Properties;  4 import javax.sql.DataSource;  5 import org.apache.ibatis.session.TransactionIsolationLevel;  6 /**  7  * 事务工厂  8 */  9 public interface TransactionFactory { 10 //设置属性 11 void setProperties(Properties props); 12 //根据Connection创建Transaction 13  Transaction newTransaction(Connection conn); 14 //根据数据源和事务隔离级别创建Transaction 15 Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit); 16 }
复制代码

  Transacrion接口定义的目的就是为了对具体的事务类型进行抽象,便于扩展;TransactionFactory与其一样,是对事务工厂的抽象,同样便于具体类型的事务工厂的扩展实现。

2.2 MyBatis事务类型

  说到这里,就不得不提到MyBatis里内置的两种事务类型及对应的事务工厂了,还记得在上一文中给出的environment配置信息,有这么一句:

 <transactionManager type="JDBC"/>

  这里的<transactionManager>标签就是用于定义项目所使用的事务类型,具体的类型由type属性来指定,此处指定使用“JDBC”类型事务,当然MyBatis还提供了另外一种“MANAGED”型事务。

    ---JDBC

    ---MANAGED

  这里的“JDBC”和“MANAGED”是在Configuration配置类的类型别名注册器中注册的别名,其对应的类分别是:JdbcTransactionFactory.class和ManagedTransactionFactory.class。具体的配置如下所述:

1  typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
2  typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

  上面的代码是在Configuration类的无参构造器中定义的,这里拿来仅用于展示,具体说明以后会介绍。

  这里提一句:类型别名注册器额原理就是将别名与具体的类类型以键值对的方式保存到一个HashMap中,这样只要知道别名(键),就可以从Map中得到对应的值(Class类型),很简单!

  现在只要知道MyBatis能够根据你在配置文件中设置的事务类型,直接找到对应的事务工厂类就行了。

  下面对上面提到的两种事务类型进行解读。

      ---JDBC事务模型:JdbcTransaction

      ---MANAFED事务模型:ManagedTransaction

  二者的不同之处在于:前者是直接使用JDK提供的JDBC来管理事务的各个环节:提交、回滚、关闭等操作,而后者则什么都不做,那么后者有什么意义呢,当然很重要。

  当我们单独使用MyBatis来构建项目时,我们要在Configuration配置文件中进行环境(environment)配置,在其中要设置事务类型为JDBC,意思是说MyBatis被单独使用时就需要使用JDBC类型的事务模型,因为在这个模型中定义了事务的各个方面,使用它可以完成事务的各项操作。而MANAGED类型的事务模型其实是一个托管模型,也就是说它自身并不实现任何事务功能,而是托管出去由其他框架来实现,你可能还不明白,这个事务的具体实现就交由如Spring之类的框架来实现,而且在使用SSM整合框架后已经不再需要单独配置环境信息(包括事务配置与数据源配置),因为在在整合jar包(mybatis-spring.jar)中拥有覆盖mybatis里面的这部分逻辑的代码,实际情况是即使你显式设置了相关配置信息,系统也会视而不见......

  托管的意义显而易见,正是为整合而设。

  我们学习MyBatis的目的正是由于其灵活性和与Spring等框架的无缝整合的能力,所以有关JDBC事务模块的内容明显不再是MyBatis功能中的重点,也许只有在单独使用MyBatis的少量系统中才会使用到。

2.3 JDBC事务模型

  虽然JDBC事务类型很少使用到,但是作为MyBatis不可分割的一部分,我们还是需要进行一定的了解,JDBC事务的实现是对JDK中提供的JDBC事务模块的再封装,以适用于MyBatis环境。

  MyBatis中的JDBC事务模块包括两个部分,分别为JDBC事务工厂和JDBC事务,整个事务模块采用的是抽象工厂模式,那么对应于每一项具体的事务处理模块必然拥有自己的事务工厂,事务模块实例通过事务工厂来创建(事务工厂将具体的事务实例的创建封装起来)。

  首先我们来看JDBC事务工厂:JdbcTransactionFactory

  JdbcTransactionFactory继承自TransactionFactory接口,实现了其中的所有方法。分别为一个设置属性的方法和两个新建事务实例的方法(参数不同),内容很简单,作用也很简单。

  其中setProperties()方法用于设置属性,这个方法在XMLConfigBuilder中解析事务标签时调用,用于解析事务标签的下级属性标签<property>(一般情况下我们并不会进行设置,但是如果我们进行了设置,那就会覆盖MyBatis中的默认设置)之后将其设置到创建的事务实例中。然而针对JDBC事务模型,在事务工厂的设置属性方法中没有任何执行代码,也就说明JDBC事务模块并不支持设置属性的功能,即使你在配置文件中设置的一些信息,也不会有任何作用。

  那么这个方法有什么用呢?前面提到,这个设置用于覆盖默认设置,只是JDBC事务模块并不支持而已,但并不代表别的事务模型不支持,同时这个方法也可用于功能扩展。

  另外两个方法显而易见,就是用于创建JDBC事务实例的生产方法,只是参数不同,方法的重载而已。其中一个生产方法仅需传递一个实例Connection,这代表一个数据库连接。而另一个方法需要传递三个参数(DataSource、TransactionIsolationLevel、boolean),其实这对应于MyBatis中SqlSession的两种生产方式,其参数与这里一一对应,这部分内容以后介绍,此处不再赘述。

  然后我们来看看JDBC事务类:JdbcTransaction

  其中有四个参数:

1   protected Connection connection;
2   protected DataSource dataSource;
3   protected TransactionIsolationLevel level;
4   protected boolean autoCommmit;

  这四个参数分别对应事务工厂中的两个生产方法中的总共四个参数,对应的在事务类中定义了两个构造器,构造实例的同时进行赋值:

复制代码
1   public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {
2     dataSource = ds;
3     level = desiredLevel;
4     autoCommmit = desiredAutoCommit;
5   }
6   public JdbcTransaction(Connection connection) {
7     this.connection = connection;
8   }
复制代码

  其次在该类中实现了Transaction接口,实现了其中的四个方法,三个功能性方法,和一个获取数据库连接的方法。三个功能方法分别是提交、回滚和关闭。

复制代码
 1   @Override
 2   public void commit() throws SQLException {
 3     if (connection != null && !connection.getAutoCommit()) {
 4       if (log.isDebugEnabled()) {
 5         log.debug("Committing JDBC Connection [" + connection + "]");
 6       }
 7       connection.commit();
 8     }
 9   }
10 
11   @Override
12   public void rollback() throws SQLException {
13     if (connection != null && !connection.getAutoCommit()) {
14       if (log.isDebugEnabled()) {
15         log.debug("Rolling back JDBC Connection [" + connection + "]");
16       }
17       connection.rollback();
18     }
19   }
20 
21   @Override
22   public void close() throws SQLException {
23     if (connection != null) {
24       resetAutoCommit();
25       if (log.isDebugEnabled()) {
26         log.debug("Closing JDBC Connection [" + connection + "]");
27       }
28       connection.close();
29     }
30   }
复制代码

  通过观察这三个方法,可以发现,其中都使用了connection来进行具体操作,因此这些方法使用的前提就是先获取connection数据库连接,Connection的获取使用getConnection()方法

复制代码
1   @Override
2   public Connection getConnection() throws SQLException {
3     if (connection == null) {
4       openConnection();
5     }
6     return connection;
7   }
复制代码

  在上面的方法中调用了openConnection()方法:

复制代码
 1  protected void openConnection() throws SQLException {
 2     if (log.isDebugEnabled()) {
 3       log.debug("Opening JDBC Connection");
 4     }
 5     connection = dataSource.getConnection();
 6     if (level != null) {
 7       connection.setTransactionIsolation(level.getLevel());
 8     }
 9     setDesiredAutoCommit(autoCommmit);
10   }
复制代码

  可见connection是从数据源dataSource中获取的,最后会调用setDesiredAutoCommit()方法:

复制代码
 1   protected void setDesiredAutoCommit(boolean desiredAutoCommit) {
 2     try {
 3       if (connection.getAutoCommit() != desiredAutoCommit) {
 4         if (log.isDebugEnabled()) {
 5           log.debug("Setting autocommit to " + desiredAutoCommit + " on JDBC Connection [" + connection + "]");
 6         }
 7         connection.setAutoCommit(desiredAutoCommit);
 8       }
 9     } catch (SQLException e) {
10       // Only a very poorly implemented driver would fail here,
11       // and there's not much we can do about that.
12       throw new TransactionException("Error configuring AutoCommit.  "
13           + "Your driver may not support getAutoCommit() or setAutoCommit(). "
14           + "Requested setting: " + desiredAutoCommit + ".  Cause: " + e, e);
15     }
16   }
复制代码

  这个方法的目的就是为connection中的自动提交赋值(真或假)。

  这么看来,我们创建事务实例所提供的三个参数就是为connection服务的,其中DataSource是用来获取Connection实例的,而TransactionIsolationLevel(事务级别)和boolean(自动提交)是用来填充connection的,通过三个参数我们获得了一个圆满的Connection实例,然后我们就可以使用这个实例来进行事务操作:提交、回滚、关闭。

2.4 关于自动提交

  在之前的代码中我们能看到在关闭操作之前调用了一个方法:resetAutoCommit():

复制代码
 1   protected void resetAutoCommit() {
 2     try {
 3       if (!connection.getAutoCommit()) {
 4         // MyBatis does not call commit/rollback on a connection if just selects were performed.
 5         // Some databases start transactions with select statements
 6         // and they mandate a commit/rollback before closing the connection.
 7         // A workaround is setting the autocommit to true before closing the connection.
 8         // Sybase throws an exception here.
 9         if (log.isDebugEnabled()) {
10           log.debug("Resetting autocommit to true on JDBC Connection [" + connection + "]");
11         }
12         connection.setAutoCommit(true);
13       }
14     } catch (SQLException e) {
15       log.debug("Error resetting autocommit to true "
16           + "before closing the connection.  Cause: " + e);
17     }
18   }
复制代码

  这里相对自动提交做个解说,如果设置自动提交为真,那么数据库将会将每一个SQL语句当做一个事务来执行,为了将多条SQL当做一个事务进行提交,必须将自动提交设置为false,然后进行手动提交。一般在我们的项目中,都需要将自动提交设置为false,即将自动提交关闭,使用手动提交

  这个方法中通过对connection实例中的自动提交设置(真或假)进行判断,如果为false,表明不执行自动提交,则复位,重新将其设置为true。(自动提交的默认值为true)这个操作执行在connection关闭之前。可以看做是连接关闭之前的复位操作。

2.5 问题

  在JdbcTransaction中提供的两个构造器中以Connection为参数的构造器额作用是什么呢?

  我们需要自动组装一个完整的Connection,以其为参数来生产一个事务实例。这用在什么场景中呢?


mybatis源码解读:transaction包(事务管理功能) 欢迎关注本人公众号: mybatis的transaction包是负责进行事务管理的包,该包内包含2个子包:jdbc子包中包含基于jdbc进行事务管理的类,managed子包中包含基于容器进行事务管理的类。 1.事务概述 事务即数据库事务,是数据库执行过程中的一个逻辑单元。事务有以下4个特性: Atomicity(原子性):事务必须被作为一个整体执行,要么全部执行, 要么全部不执行。不允许只执行其中的一部分。 Consistency(一致性):事务应该保证数据库从一致性状态... 阅读详情

相关推荐

同花顺Supermind量化交易 技术面分析专题(一)-- 相似k线的形态验证与选股

W底”,“多头上涨”,“趋势回踩”,”上涨中继“这些都是常见的K线形态,以”上涨中继“为例,当股价快速上涨后,出现盘整形态而非顶部形态,预示股价还会进一步上涨,那么本节主要讲述”上涨中继”形态是否能够预测未来股价上涨,以及如何应用“上涨中继”形态,来快速选股。"相似K线"技术相比于传统的K线组合而言更具技术性,其还有较多的运用空间,比如:运用顶部形态来监控个股潜在的下跌风险,运用相似度来监控个股是否脱离大盘走势,研究各类形态的上涨预测能力,并应用于选股等等。第一步:选取一段标准的“上涨中继”形态K线图。

qq_22808537的博客 4544

MyBatis源码解析(三)——Transaction事务模块

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634151.html 1、回顾   之前介绍了Environment环境类,这其实是一个单例类,在MyBatis运行开启后只会存在一个唯一的环境实例,虽然我们可以在Configuration配置文件中配置多个环境,但是项目运行中只会存在其中的一个,一般项目会存在开发环境和测试环境、生产...

weixin_30468137的博客 428

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 492

Mybatis事务的理解(Transaction以及DbUtil)

事务等级划分 首先要了解Mybatis对事务的操作,第一步是先了解数据库的事务隔离级别有哪些: 事务隔离级别 脏读 不可重复读 幻读 解释 读未提交(read-uncommitted) 是 是 是 可以读到未提交的事物 不可重复读(read-committed) 否 是 是 只能读提交的事物 可重复读(repeatable-read) 否 否 是 事务提交前后都能读【MySql默认】 串行化(serializable) 否 否 否 serializable时会锁表,是最安全的,也

five-five 1580

别再手动填序号了!用Python脚本在Arcgis属性表里实现分组自动编号(附完整代码)

本文详细介绍了如何利用Python脚本在Arcgis属性表中实现分组自动编号,告别低效的手工操作。通过核心代码解析和实战教程,帮助GIS工程师快速掌握自动化编号技术,提升工作效率并降低错误率。特别适合城市规划、国土调查等需要处理大量分组数据的场景。

weixin_42532473的博客 305

STM32无线遥控小车的设计

基于SPI通信的无线摇杆小车的设计

weixin_69414084的博客 2926

springboot+mybatis解决多数据源切换事务控制不生效的问题

网上好多的springboot的事务都是瞎扯,根本不起作用,后来通过各种渠道查证,springboot的声明式事务需要重写Transaction。 追溯源代码: 查看源代码中DataSourceTransactionManager这个类 当我们配置了事物管理器和拦截Service中的方法后,每次执行Service中方法前会开启一个事务,并且同时会缓存一些东西:D...

gaoshili001的专栏 3万+

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

mybatis源码学习------Transaction

简介 ManagedTransactionFactoryManagedTransactionFactoryMyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。 在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务,spring如何处理事务的代码会在后续分析mybatis-spring工程时分析,这里只看mybatis提供的简单实现,逻辑很简单,直接看注释就行了,不做分析。 类图如下: 接口 事务工厂接口 public interfac

我是兴锅的博客 461

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

Xilinx Vivado LDPC IP core,TSN IP core. 各种IP core

qq_1432825237的博客 3988

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1494

mybatis mysql 事务处理_Spring Transaction + MyBatis SqlSession事务管理机制研究学习

线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交...

weixin_33358246的博客 1615

钉钉多维表格开发

从0到1完成钉钉多维表格开发SDK对接与实践案例。

沉修所长,勇逐新机;安而不怠,静而思变 3594

Mybatis 源码阅读----事务模块(Transaction)

该章将介绍Mybatis对事务的封装,事务模块所在的包位置如下: 各个类之间的关系图如下: 1、Transaction接口如下 public interface Transaction { /** * Retrieve inner database connection. * 获取数据库连接 * @return DataBase connection * @thr...

qq_43390114的博客 347

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【MyBatis源码】transaction包JdbcTransaction和 ManagedTransaction源码分析

MyBatis的transaction包是负责进行事务管理的包,该包内包含两个子包:jdbc子包中包含基于 JDBC进行事务管理的类,managed子包中包含基于容器进行事务管理的类。事务功能是由数据库提供的。以 MySQL 数据库为例,MySQL 主要有两种引擎:MyISAM和 InnoDB。MySQL默认操作模式就是自动提交模式。在这种模式下,除非显式地开始一个事务,否则每个查询都被当作一个单独的事务自动提交执行。

发现问题,面对问题,分析问题,解决问题,总结问题 1086

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

mybatis事务

1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。四大还好说,问题是七大传播特性是哪儿来的?是Spring在当前线程内,处理多个数据库操作方法事务时所做的一种事务应用策略。事务本身并不存在什么传播特性,不要混淆事务本身和Spring的事务应用策略。(当然,找工作面试时,还是可以巧妙的描述传播特性的) 2.一说到事务,人们可能又会想起create、begin、commit、rollback、close、suspend。可实际上,只有commit、rollback

大叶子不小的博客 1717

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Mybatis之Sqlsession、Connection和Transaction三者间的关系

最近在看mybatis的源码,搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系,debug之后发现有不少疑惑,于是按照原文整理了一下,记录下debug中的一些困惑点。Mybatis。

meser88的博客 4398

MyBatis 事务管理(Transaction)实现原理深度解析

摘要: 本文深入探讨MyBatis在事务管理中的核心机制及其与Spring的整合实践。MyBatis通过Transaction接口抽象事务操作,提供JDBC(默认)和MANAGED两种事务管理模式,分别由MyBatis或外部容器(如Spring)控制事务边界。与Spring整合时,SpringManagedTransaction将事务管理权移交至Spring的PlatformTransactionManager,通过TransactionSynchronizationManager实现连接复用与线程绑定。文

持续输出Java相关知识 1019

精尽 MyBatis 源码分析 —— 事务模块

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务。

smart_an的专栏 918

Mybatis_原理_05_数据源和事务模块

本文介绍了Mybatis的数据源模块和事务模块,从如何加载解析配置,以及在源码哪些地方怎么使用。数据源其实就是对Connection连接的管理,通过连接池管理数据库连接,提高性能和资源利用率。MyBatis 的事务管理模块是其核心功能之一,负责确保数据库操作的原子性和一致性。事务管理模块可以通过多种方式配置,以适应不同的应用场景。MyBatis 支持两种主要的事务管理器类型:JDBC 和 MANAGED。

abc2675811870的博客 921

Mybatis:颠覆你心中对事务的理解

1.说到数据库事务,人们脑海里自然不自然的就会浮现出事务的四大特性、四大隔离级别、七大传播特性。 四大还好说,问题是七大传播特性是哪儿来的?是Spring在当前线程内,处理多个数据库操作方法事务时所做的一种事务应用策略。事务本身并不存在什么传播特性,不要混淆事务本身和Spring的事务应用策略。(当然,找工作面试时,还是可以巧妙的描述传播特性的)2.一说到事务,人们可能又会想起create、begin、commit、rollback、close、suspend。 可实际上,只有commit、rollback

LoveSummer 1万+

Mybatis源码学习(14)-数据库事务Transaction

一、 事务概念 概念:数据库事务是构成单一逻辑工作单元的操作集合。 一个典型的数据库事务如下所示: BEGIN TRANSACTION //事务开始 SQL1 SQL2 COMMIT/ROLLBACK //事务提交或回滚 解释: 数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。 构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。 构成事务的所有操作,...

向心行者 724

大龄菜鸟-》 mybatis 源码阅读-》 transaction 事务模块

一: 概述 这个模块是说事务的。代码倒是看了。表明不深,我看完后就一个想法,这就实现了事务了吗?应该不是吧?怎么会呢。不应该更难点吗?我还真觉得这就是些简单的实现。应该不是事务的老窝。我们平时项目应该用的是spring里面写的那套事务。目前就先看这个浅的是啥回事。 看下包下有多少类 二: TransactionFactory 类 /** * Copyright 2009-2020 the original author or authors. * * Licensed .

lileronglilerong的专栏 291
上一篇: Mybatis 源码学习(五) DataSource
下一篇: Mybatis 源码学习(七) 缓存的刷新
天天
博客等级 码龄21年 219粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值