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操作都是无效的。 |