青岛建站公司推荐,好看简洁的logo,凡客模板wordpress,做简图的网站MyBatis的事务管理是由TransactionFactory和Transaction两个接口定义的#xff0c;TransactionFactory负责生成Transaction#xff0c;这是一个典型的工厂模式。
官方提供了事务管理的两种模式#xff1a;
Managed#xff1a;对应ManagedTransactionFactory和ManagedTran…MyBatis的事务管理是由TransactionFactory和Transaction两个接口定义的TransactionFactory负责生成Transaction这是一个典型的工厂模式。
官方提供了事务管理的两种模式
Managed对应ManagedTransactionFactory和ManagedTransactionJDBC对应JdbcTransactionFactory和JdbcTransaction
重点看一下Transaction中提交和回滚的实现
public class ManagedTransaction implements Transaction {Overridepublic void commit() throws SQLException {// Does nothing}Overridepublic void rollback() throws SQLException {// Does nothing}}public class JdbcTransaction implements Transaction {Overridepublic void commit() throws SQLException {if (connection ! null !connection.getAutoCommit()) {if (log.isDebugEnabled()) {log.debug(Committing JDBC Connection [ connection ]);}connection.commit();}}Overridepublic void rollback() throws SQLException {if (connection ! null !connection.getAutoCommit()) {if (log.isDebugEnabled()) {log.debug(Rolling back JDBC Connection [ connection ]);}connection.rollback();}}
}可以看出这两者的主要区别在于ManagedTransaction不会进行实际的事务提交和回滚而是交由外部进行控制而JdbcTransaction是我们能进行实际事务提交和回滚的所以如果我们要手动控制事务应该指定事务管理器为JdbcTransactionFactory例如在mybatis的配置文件中
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLED/dataSource/environment/environments
/configuration那Transaction和实际执行查询的SqlSession又是什么关系呢原来是创建SqlSession的时候会交由Executor管理一起传给SqlSession
public class DefaultSqlSessionFactory implements SqlSessionFactory {private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx null;try {final Environment environment configuration.getEnvironment();final TransactionFactory transactionFactory getTransactionFactoryFromEnvironment(environment);tx transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);final Executor executor configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException(Error opening session. Cause: e, e);} finally {ErrorContext.instance().reset();}}
}当我们执行SqlSession的commit()时实际上是调用Executor的commit进而调用Transaction的commit()
public class DefaultSqlSession implements SqlSession {Overridepublic void commit(boolean force) {try {executor.commit(isCommitOrRollbackRequired(force));dirty false;} catch (Exception e) {throw ExceptionFactory.wrapException(Error committing transaction. Cause: e, e);} finally {ErrorContext.instance().reset();}}
}public abstract class BaseExecutor implements Executor {Overridepublic void commit(boolean required) throws SQLException {if (closed) {throw new ExecutorException(Cannot commit, transaction is already closed);}clearLocalCache();flushStatements();if (required) {transaction.commit();}}
}