Configuration--environments--transactionManager(三-5-2)
来源:互联网 发布:吉他班一般多少钱知乎 编辑:程序博客网 时间:2024/06/04 23:32
上一篇文章中我们分析了dataSource,本篇文章中我们来分析environments中的另一个配置transactionManager.
首先我们来回忆一下解析environments标签时,解析transactionManager标签的代码:
TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
private TransactionFactory transactionManagerElement(XNode context) throws Exception { if (context != null) { String type = context.getStringAttribute("type"); Properties props = context.getChildrenAsProperties(); TransactionFactory factory = (TransactionFactory) resolveClass(type).newInstance(); factory.setProperties(props); return factory; } throw new BuilderException("Environment declaration requires a TransactionFactory."); }
从上述代码我们可以看出,最终我们是需要一个TransactionFactory,当然我们可以自定义,但是本篇文章,我们先来了解一下mybaits内置的TransactionFactory :
1.JDBC: 这个配置就是直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域.
2.MANAGED:这个配置几乎没做什么,它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文).
Configuration类的构造方法中,已经帮我们定义了这两个类的别名:
typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
在看mybaits内置的事务管理器之前,我们先来看一下其TransactionFactory接口的定义:
public interface TransactionFactory { void setProperties(Properties props); Transaction newTransaction(Connection conn); Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);}
可以看到,主要的方法就是设置参数和获取Transaction.
我们再来看Transaction接口的定义:
public interface Transaction { Connection getConnection() throws SQLException; void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException;}
主要方法是获取Connection,提交事务,回滚事务,从这里我们可以看出,其实Transaction就是对Connection的封装.
1.JdbcTransactionFactory
public class JdbcTransactionFactory implements TransactionFactory { public void setProperties(Properties props) { } public Transaction newTransaction(Connection conn) { return new JdbcTransaction(conn); } public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) { return new JdbcTransaction(ds, level, autoCommit); }}
从上述代码,我们可以看出,JdbcTransactionFactory的主要作用就是创建JdbcTransaction,具体的事务操作,还是由JdbcTransaction完成的.
我们首先来看JdbcTransaction的构造方法:
// 直接传入一个Connection public JdbcTransaction(Connection connection) { this.connection = connection; } // 传入一个DataSource,可想而知,之后会通过DataSource获取Connection public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) { dataSource = ds; level = desiredLevel; autoCommmit = desiredAutoCommit; }
再来看JdbcTransaction的getConnection方法:
public Connection getConnection() throws SQLException { // 果然,当我们构造方法传入的是DataSource时,会通过openConnection去获取一个新的连接 if (connection == null) { openConnection(); } return connection; } protected void openConnection() throws SQLException { if (log.isDebugEnabled()) { log.debug("Opening JDBC Connection"); } // 通过传入的dataSource获取一个新的Connection connection = dataSource.getConnection(); if (level != null) { // 设置Connection隔离级别 connection.setTransactionIsolation(level.getLevel()); } // 设置是否自动提交 setDesiredAutoCommit(autoCommmit); } protected void setDesiredAutoCommit(boolean desiredAutoCommit) { try { // 这里可以看出,最终将以事务定义的是否自动提交为准 if (connection.getAutoCommit() != desiredAutoCommit) { if (log.isDebugEnabled()) { log.debug("Setting autocommit to " + desiredAutoCommit + " on JDBC Connection [" + connection + "]"); } connection.setAutoCommit(desiredAutoCommit); } } catch (SQLException e) { throw new TransactionException("Error configuring AutoCommit. " + "Your driver may not support getAutoCommit() or setAutoCommit(). " + "Requested setting: " + desiredAutoCommit + ". Cause: " + e, e); } }
接着我们再来看commit,rollback和close方法:
public void commit() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Committing JDBC Connection [" + connection + "]"); } connection.commit(); } } public void rollback() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Rolling back JDBC Connection [" + connection + "]"); } connection.rollback(); } } public void close() throws SQLException { if (connection != null) { resetAutoCommit(); if (log.isDebugEnabled()) { log.debug("Closing JDBC Connection [" + connection + "]"); } connection.close(); } }
我们可以看出JdbcTransaction实际上就是使用了Connection本身的事务控制,最终都是调用Connection的方法.
2.ManagedTransactionFactory
其实ManagedTransactionFactory也没有特别的地方,主要的就是ManagedTransactionFactory生成的ManagedTransaction.
ManagedTransaction的commit和rollback方法都是空的,不做具体的操作,所以我们之前说,这种方式是让容器来管理事务.
public void commit() throws SQLException { // Does nothing } public void rollback() throws SQLException { // Does nothing }
综上,我们就了解了dataSource和transactionManager,现在你可能还有点疑惑,不过等到我们讲到后面真正使用到他们的时候,你就会豁然开朗.
- Configuration--environments--transactionManager(三-5-2)
- Configuration--environments(三-5)
- Configuration--environments--dataSource(三-5-1)
- TransactionManager
- Configuration--typeAliases(三-2)
- environments
- mybatis 配置文件configuration environments以及单独使用mybatis的demo
- Managing Multiple Configuration File Environments with Pre-Build Events
- mybatis 配置文件configuration environments以及单独使用mybatis的demo
- Configuration(三)
- (读书笔记)mybatis (三)-----environments详解
- Configuration--mappers--XMLMapperBuilder.parse(三-8-2)
- Configuration--properties(三-1)
- Configuration--objectFactory(三-3)
- Configuration--settings(三-4)
- Configuration--databaseIdProvider(三-6)
- Configuration--typeHandlers(三-7)
- Configuration--mappers(三-8)
- ROS USB摄像头驱动安装
- 学密码学一定得学程序
- 深入理解Mysql——schema设计与大表alter操作
- Java lombok的使用
- 将csv文件转化为可视化的html表格
- Configuration--environments--transactionManager(三-5-2)
- Network Saboteur (深搜)
- SSLHandshakeException
- ajax上传表单带附件
- OpenCV(一) 主要模块及结构功能简述
- tf.one_hot 实例
- <8/3>集训日记
- Spring的自动代理
- 训练总结 8.3