澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

MyBatis事务管理源码阅读
分类:脚本专栏

在实质上的费用专门的学问中,MyBatis已经济体改为了那时最风靡的关系型数据库与实体Model的照射框架。
明天就容术数习一下MyBatis的事务管理部分源码。

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其特别首要的二个上边。本文将从业务的归类、配置和贯彻解析MyBatis的事务管理的完结机制。

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其至极主要的叁个方面。本文将从业务的分类、配置和促成深入分析MyBatis的事务管理的达成机制。

Mybatis事务处理位于 org.apache.ibatis.transaction 下。类图如下:
图片 1

MyBatis事务的分类

对数据库的政工来说,应该具备以下几点:成立、提交、回滚、关闭。对应地,MyBatis将业务抽象成了Transaction接口:其接口定义如下:

图片 2

MyBatis的事务管理分为二种方式:1、使用JDBC的事务管理机制:即利用java.sql.Connection对象完毕对作业的交付、回滚(rollback、关闭等

2、使用MANAGED的事务管理机制:这种机制MyBatis本身不会去贯彻事务管理,而是让程序的容器如(JBOSS,Weblogic)来兑现对工作的管制

图片 3

MyBatis事务的归类

入口类:
Transaction

MyBatis事务的布局

在采取MyBatis时,日常会在MyBatisXML配置文件中定义类似如下的新闻:

图片 4

<environment>节点定义了连年有个别数据库的消息,其子节点<transactionManager> 的type 会决定大家用哪些项目标事务处理机制。

若是想深造Java工程化、高品质及布满式、深入显出。微服务、Spring,MyBatis,Netty源码剖析的相恋的人能够加作者的Java高端沟通:787707172,群里有Ali大腕直播讲明技能,以及Java大型互连网技巧的录像免费享受给大家。

Wraps a database connection. Handles the connection lifecycle that comprises: its creation, preparation, commit/rollback and close.

MyBatis事务的制造

MyBatis事务的成立是交由TransactionFactory 事务工厂来创立的,假诺大家将<transactionManager>的type 配置为"JDBC",那么,在MyBatis起首消除析<environment>节点时,会基于type="JDBC"创设二个JdbcTransactionFactory工厂,其源码如下:

/** * 解析<transactionManager>节点,创建对应的TransactionFactory * @param context * @return * @throws Exception */ private TransactionFactory transactionManagerElement(XNode context) throws Exception { if (context != null) { String type = context.getStringAttribute; Properties props = context.getChildrenAsProperties(); /* 在Configuration初始化的时候,会通过以下语句,给JDBC和MANAGED对应的工厂类 typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class); 下述的resolveClass.newInstance()会创建对应的工厂实例 */ TransactionFactory factory = (TransactionFactory) resolveClass.newInstance(); factory.setProperties; return factory; } throw new BuilderException("Environment declaration requires a TransactionFactory."); }

上述代码所示,假使type = "JDBC",则MyBatis会创设八个JdbcTransactionFactory.class 实例;假若type="MANAGED",则MyBatis会成立一个MangedTransactionFactory.class实例。MyBatis对<transactionManager>节点的剖析会生成 TransactionFactory实例;而对<dataSource>深入分析会生成datasouce实例。作为<environment>节点,会依赖TransactionFactory和DataSource实例成立二个Environment对象,代码如下所示:

 private void environmentsElement(XNode context) throws Exception { if (context != null) { if (environment == null) { environment = context.getStringAttribute("default"); } for (XNode child : context.getChildren { String id = child.getStringAttribute; //是和默认的环境相同时,解析之 if (isSpecifiedEnvironment { //1.解析<transactionManager>节点,决定创建什么类型的TransactionFactory TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager")); //2. 创建dataSource DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource")); DataSource dataSource = dsFactory.getDataSource(); //3. 使用了Environment内置的构造器Builder,传递id 事务工厂TransactionFactory和数据源DataSource Environment.Builder environmentBuilder = new Environment.Builder .transactionFactory(txFactory) .dataSource(dataSource); configuration.setEnvironment(environmentBuilder.build; } } } }

Environment表示着三个数据库的连年,生成后的Environment对象会棉被服装置到Configuration实例中,以供后续的采纳。

图片 5

经过业务工厂TransactionFactory很轻松获得到Transaction对象实例。大家以JdbcTransaction为例,看一下JdbcTransactionFactory是怎样生成JdbcTransaction的,代码如下:

public class JdbcTransactionFactory implements TransactionFactory { public void setProperties(Properties props) { } /** * 根据给定的数据库连接Connection创建Transaction * @param conn Existing database connection * @return */ public Transaction newTransaction(Connection conn) { return new JdbcTransaction; } /** * 根据DataSource、隔离级别和是否自动提交创建Transacion * * @param ds * @param level Desired isolation level * @param autoCommit Desired autocommit * @return */ public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) { return new JdbcTransaction(ds, level, autoCommit); }}

如上就是,JdbcTransactionFactory会创立JDBC类型的Transaction,即JdbcTransaction。类似地,ManagedTransactionFactory也会创设ManagedTransaction。上面分别深深JdbcTranaction 和ManagedTransaction,看它们到底是什么完成事务管理的。

JdbcTransaction

JdbcTransaction直接动用JDBC的提交和回滚事务管理机制 。它借助与从dataSource中获取的连年connection 来治本transaction 的作用域,connection对象的获取被延迟到调用getConnection()方法。如果autocommit设置为on,开启状态以来,它会忽视commit和rollback。

直观地讲,正是JdbcTransaction是运用的java.sql.Connection 上的commit和rollback效率,JdbcTransaction只是一对一于对java.sql.Connection事务管理进行了三回包装,Transaction的事务管理都以经过java.sql.Connection完毕的。

ManagedTransactionManagedTransaction让容器来管理业务Transaction的方方面目生命周期,意思乃是,使用ManagedTransaction的commit和rollback作用不会对作业有其余的熏陶,它怎么样都不会做,它将事务管理的任务移交给了容器来落实。

对数据库的业务来讲,应该享有以下几点:创制、提交、回滚、关闭。对应地,MyBatis将业务抽象成了Transaction接口:其接口定义如下:

接口中定义的法子详解

图片 6

  1. Connection getConnection() 获取数据库连接
  2. void commit() 事务提交
  3. void rollback() 事务回滚
  4. void close() 关闭连接
  5. Integer getTimeout() 获取超时时间设置

MyBatis的事务管理分为三种格局:

再来看一下,TransactionFactory,鲜明它是开创Transaction的工厂类。

1、使用JDBC的事务管理机制:即利用java.sql.Connection对象完毕对事情的提交、回滚(rollback、关闭等

  1. void setProperties(Properties props);
  2. Transaction newTransaction(Connection conn);
  3. Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);

2、使用MANAGED的事务管理机制:这种体制MyBatis自己不会去完结事务处理,而是让程序的器皿如(JBOSS,Weblogic)来完结对作业的保管

Transaction有多个落到实处类,分别是JdbcTransactionManagedTransaction,前面二个是原生的事务生命周期管理类,而后人是由容器来管理作业的生命周期。这里所指的器皿是指Spring恐怕是汤姆cat。

图片 7

Connection对象是透过DataSource来收获的,同有的时候常间会安装数据库事务的割裂等级TransactionIsolationLevel

MyBatis事务的布署

protected void openConnection() throws SQLException {    if (log.isDebugEnabled {      log.debug("Opening JDBC Connection");    }    this.connection = this.dataSource.getConnection();    if (this.level != null) {      this.connection.setTransactionIsolation(this.level.getLevel;    }}

在行使MyBatis时,平时会在MyBatisXML配置文件中定义类似如下的新闻:

TransactionIsolationLevel是叁个枚举类,维护了一个final类型的int值,来抽象数据库事务的几个品级。

图片 8

/**    事务隔离级别*/public enum TransactionIsolationLevel {  NONE(Connection.TRANSACTION_NONE),                                            //1.none   不要求事务管理     0  READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),                        //2.read_committed   已提交读  1  READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),                    //3 .read_uncomittted  未提交读  2  REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),                      //4.repeatable_read  可重复读   4  SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);                            // 5.sealalizable  可串行化    8  private final int level;  private TransactionIsolationLevel(int level) {    this.level = level;  }  public int getLevel() {    return level;  }}

<environment>节点定义了连接有个别数据库的音信,其子节点<transactionManager> 的type 会决定大家用哪些品种的事务管理机制。

在事务管理进程中,还会有四个须求的根本角色,ConnectionDataSource。关于那五个类的上学,以往再张开记录和享受。

MyBatis事务的成立

BTW,那是自己的率先篇博文,这篇小说也是对马克down语法的上学。

MyBatis事务的创设是交由TransactionFactory 事务工厂来成立的,借使大家将<transactionManager>的type 配置为"JDBC",那么,在MyBatis初叶化解析<environment>节点时,会基于type="JDBC"创立四个JdbcTransactionFactory工厂,其源码如下:

二个平凡而常常的人,时时都会感到被生活的波澜巨浪所淹没。你会被淹没吗?除非你甘心沉沦 !!!

/**

图片 9

* 深入分析<transactionManager>节点,成立对应的TransactionFactory

* @param context

* @return

* @throws Exception

*/

private TransactionFactory transactionManagerElement(XNode context) throws Exception {

if (context != null) {

String type = context.getStringAttribute;

Properties props = context.getChildrenAsProperties();

/*

在Configuration伊始化的时候,会经过以下语句,给JDBC和MANAGED对应的工厂类

typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);

typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

下述的resolveClass.newInstance()会创建对应的厂子实例

*/

TransactionFactory factory = (TransactionFactory) resolveClass.newInstance();

factory.setProperties;

return factory;

}

throw new BuilderException("Environment declaration requires a TransactionFactory.");

}

上述代码所示,如若type = "JDBC",则MyBatis会成立四个JdbcTransactionFactory.class 实例;假设type="MANAGED",则MyBatis会创造叁个MangedTransactionFactory.class实例。

万一想深造Java工程化、高质量及布满式、深入显出。微服务、Spring,MyBatis,Netty源码解析的爱侣能够加笔者的Java高端调换:787707172,群里有Ali大咖直播解说技能,以及Java大型互连网技巧的摄像无偿享受给大家。

MyBatis对<transactionManager>节点的分析会生成 TransactionFactory实例;而对<dataSource>深入分析会生成datasouce实例。作为<environment>节点,会依靠TransactionFactory和DataSource实例成立二个Environment对象,代码如下所示:

private void environmentsElement(XNode context) throws Exception {

if (context != null) {

if (environment == null) {

environment = context.getStringAttribute("default");

}

for (XNode child : context.getChildren {

String id = child.getStringAttribute;

//是和暗中认可的情况一样不常间,剖判之

if (isSpecifiedEnvironment {

//1.剖析<transactionManager>节点,决定创造什么品种的TransactionFactory

TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));

//2. 创建dataSource

DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));

DataSource dataSource = dsFactory.getDataSource();

//3. 行使了Environment内置的布局器Builder,传递id 事务工厂TransactionFactory和数据源DataSource

Environment.Builder environmentBuilder = new Environment.Builder

.transactionFactory(txFactory)

.dataSource(dataSource);

configuration.setEnvironment(environmentBuilder.build;

}

}

}

}

Environment表示着一个数据库的连年,生成后的Environment对象会棉被服装置到Configuration实例中,以供后续的应用。

图片 10

因而业务工厂TransactionFactory很轻易取获得Transaction对象实例。大家以JdbcTransaction为例,看一下JdbcTransactionFactory是什么样生成JdbcTransaction的,代码如下:

public class JdbcTransactionFactory implements TransactionFactory {

public void setProperties(Properties props) {

}

/**

* 依照给定的数据库连接Connection创立Transaction

* @param conn Existing database connection

* @return

*/

public Transaction newTransaction(Connection conn) {

return new JdbcTransaction;

}

/**

* 遵照DataSource、隔断品级和是还是不是自动提交创立Transacion

*

* @param ds

* @param level Desired isolation level

* @param autoCommit Desired autocommit

* @return

*/

public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {

return new JdbcTransaction(ds, level, autoCommit);

}

}

如上实属,JdbcTransactionFactory会创设JDBC类型的Transaction,即JdbcTransaction。类似地,ManagedTransactionFactory也会创建ManagedTransaction。上边分别深远JdbcTranaction 和ManagedTransaction,看它们到底是何等完结事务管理的。

JdbcTransaction

JdbcTransaction直接运用JDBC的付出和回滚事务处理机制 。它借助与从dataSource中获得的接连connection 来保管transaction 的功效域,connection对象的获得被延迟到调用getConnection()方法。要是autocommit设置为on,开启状态以来,它会忽视commit和rollback。

直观地讲,正是JdbcTransaction是使用的java.sql.Connection 上的commit和rollback成效,JdbcTransaction只是一对一于对java.sql.Connection事务管理举行了一回包装,Transaction的事务管理都以通过java.sql.Connection达成的。

ManagedTransaction

ManagedTransaction让容器来治本业务Transaction的全体生命周期,意思正是,使用ManagedTransaction的commit和rollback作用不会对作业有另外的震慑,它怎么都不会做,它将事务管理的义务移交给了容器来贯彻。

款待职业一到七年的Java程序猿朋友们步入Java高档交换:787707172

本群提供无偿的学习指引 架构资料 以及免费的解答

不明白难题都足以在本群建议来 之后还有直播平台和教授直接交换啊

本文由澳门太阳娱乐集团官网发布于脚本专栏,转载请注明出处:MyBatis事务管理源码阅读

上一篇:【太阳集团太阳娱乐登录】P1880 石子合并,p188 下一篇:没有了
猜你喜欢
热门排行
精彩图文