框架原理与源码解析: MyBatis_No2事务管理机制

MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。

MyBatis的事务管理的实现机制

#首先,Transaction的接口设计以及其不同实现JdbcTransaction 和 ManagedTransaction

#然后,MyBatis的XML配置文件入手,讲解MyBatis事务工厂的创建和维护,进而阐述MyBatis事务的创建和使用

#追后,分析JdbcTransactionManagedTransaction的实现和二者的不同特点

核心内容

#一概述

#二事物的配置创建和使用

      ##1,事务的配置

      ##2,事务工厂的创建

      ##3,事务工厂TransactionFactory

      ##4,事务Transaction的创建

      ##5,JDBCTransaction

      ##6,ManagedTransaction

一、概述

数据库事务:创建(create)、提交(commit)、回滚(rollback)、关闭(close);

I   Transaction  

m  getConnection();   连接

m  commit();               提交

m  rollback();              回滚

m  close();                  关闭

事务管理机制:JDBC的事务管理机制、Manged的事务管理机制

一、JDBC的事务管理机制:利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等

二、Manged的事务管理机制:制MyBatis自身不会去实现事务管理,而是让程序的容器如(JBOSS,Weblogic)来实现对事务的管理

C    JdbcTransaction                                           C    ManagedTransaction                                  

m  getConnection()                                             m  getConnection()

m  commit()                                                         m  commit() 

m  rollback()                                                        m  rollback()

m  close()                                                            m  close()

m  openConnection()                                          m  openConnection()

m  setDesireAutoCommit(boolean)

m  resetAutoCommit()

二、事务的配置、创建和使用

1.事务的配置      MyBatisXML

配置节点<Configuration>—><environments>

环境节点<environment>节点 :

    ##数据源节点<dataSource>                                                        [ 数据源信息    ]        

    ##事务节点   <transactionManager type="JDBC">子节点        [ 事务类型信息]

         ##type="JDBC"            JDBC管理事务

         ##type="MANAGED"    WEB管理事务

2.事务工厂的创建

创建原理:

    ## MyBatis初始化解析<environment>节点时,会根据<transactionManager>的type创建一个XxxTransactionFactory工厂。

    ###如果type = "JDBC",        则MyBatis会创建一个JdbcTransactionFactory.class 实例;

    ###如果type ="MANAGED",则MyBatis会创建一个MangedTransactionFactory.class实例。

        解析<transactionManager>节点生成 TransactionFactory实例;

        解析<dataSource>会生成datasouce实例;              (关于dataSource的解析和原理, Mybatis数据源与连接池  )

    补充:<environment>节点,会根据TransactionFactory和DataSource实例创建一个Environment对象。

3.事务工厂TransactionFactory

##方法一:通过指定的Connection对象创建Transaction

##方法二:通过数据源DataSource来创建Transaction

I  TransactionFactory     

m  setProperties(Properties)

m  newTransaction(Connection)

m  newTransaction(DataSource,TransactionIsolationLevel)

C   JdbcTransactionFactory           C  ManagedTransactionFactory

4.事务创建Transaction

####  通过事务工厂TransactionFactory很容易获取到Transaction对象实例

####  JdbcTransactionFactory会创建JDBC类型的Transaction,即JdbcTransaction。

类似, ManagedTransactionFactory也会创建ManagedTransaction。

5.JDBCTransaction

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

    直观地讲,就是JdbcTransaction是使用的java.sql.Connection 上的commit和rollback功能,JdbcTransaction只是相当于对java.sql.Connection事务处理进行了一次包装(wrapper),Transaction的事务管理都是通过java.sql.Connection实现的。

6.ManagedTransaction

        ManagedTransaction让容器来管理事务Transaction的整个生命周期,ManagedTransaction的commit和rollback功能不会对事务有任何的影响,它什么都不会做,它将事务管理的权利移交给了容器来实现。

让容器管理事务transaction的整个生命周期

 1>connection的获取延迟到getConnection()方法的调用

 2>忽略所有的commit和rollback操作

 3>默认情况下,可以关闭一个连接connection,也可以配置它不可以关闭一个连接

 4>容器来管理transaction的整个生命周期

注意:如果我们使用MyBatis构建本地程序,即不是WEB程序,若将type设置成"MANAGED",那么,我们执行的任何update操作,即使我们最后执行了commit操作,数据也不会保留,不会对数据库造成任何影响。因为我们将MyBatis配置成了“MANAGED”,即MyBatis自己不管理事务,而我们又是运行的本地程序,没有事务管理功能,所以对数据库的update操作都是无效的。

 

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/82498550