基本逻辑比较清晰的文章 :
https://blog.csdn.net/u010853261/article/details/78118619/
断点跟着流程走的,很详细的文章
https://www.jianshu.com/p/8ff9201ed7d6
Mybatis自己封装了两种事务实现方式:
JDBC:就是按照 jdbc 的方式来控制事务的提交、回滚和关闭等操作,Mybatis 对其进行了一下封装,底层调用的还是jdbc的具体实现。以 Mysql 为例,如果Mybatis设置了事务管理器为 JDBC,那么在执行事务操作 commit、rollback 方法时,实际调用的是
mysql-connector-java-xxx.jar 中 ConnectionImpl 类里的 commit、rollback、close方法。下面会简单分析下 ConnectionImpl 类中事务实现源码。
MANAGED:选择这种方式时,Mybatis 会释放事务管理权,并将事务交由外部容器管理,如与 Spring 整合时,会将事务交给 Spring 中的事务实现类 SpringManagedTransaction 来管理。
如果mybatis没实现自己的 transactionFactory ,就用SpringManagedTransactionFactory
SpringManagedTransaction持有dataSource,可以创建connection
org.mybatis.spring.SqlSessionFactoryBean
if (this.transactionFactory == null) {
this.transactionFactory = new SpringManagedTransactionFactory();
}
Environment environment = new Environment(this.environment, this.transactionFactory, this.dataSource);
configuration.setEnvironment(environment);
Mybatis配置文件中事务类型的配置方式:
<configuration>
<--省略其他配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driverClasss}"/>
<property name="url" value="${jdbcUrl}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
网友评论