最近在验证 defalutAutoCommit 事务提交的时候出现了一个问题 让我百思不得其解
一般来说把数据源属性设置成defalutAutoCommit=false 事务不会自动提交,也就是说在没有使用spring的时候新增一条数据是不会自动提交的到数据库的,但是事实上是不管defalutAutoCommit=false还是=true 在数据依然可以看到有新增的记录.....
打开debug日志....
logging: level: com: debug org: debug
日志截取如下:
org.mybatis.spring.SqlSessionUtils : Creating a new SqlSession
2020-03-22 11:39:12.627 DEBUG 2248 --- [nio-8888-exec-4] org.mybatis.spring.SqlSessionUtils : SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7f1802b5] was not registered for synchronization because synchronization is not active
2020-03-22 11:39:13.571 DEBUG 2248 --- [nio-8888-exec-4] o.s.jdbc.datasource.DataSourceUtils : Fetching JDBC Connection from DataSource
2020-03-22 11:39:13.571 DEBUG 2248 --- [nio-8888-exec-4] o.m.s.t.SpringManagedTransaction : JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f83eb84] will not be managed by Spring
2020-03-22 11:39:13.571 DEBUG 2248 --- [nio-8888-exec-4] c.c.f.d.d.f.m.d.TestOqMapper.createUser : ==> Preparing: insert into fic_user_test xxx,xxx) values (?,?);
2020-03-22 11:39:13.572 DEBUG 2248 --- [nio-8888-exec-4] c.c.f.d.d.f.m.d.TestOqMapper.createUser : ==> Parameters: xxxx(String), xxxx(String)
2020-03-22 11:39:13.577 DEBUG 2248 --- [nio-8888-exec-4] c.c.f.d.d.f.m.d.TestOqMapper.createUser : <== Updates: 1
2020-03-22 11:39:13.578 DEBUG 2248 --- [nio-8888-exec-4] o.m.s.t.SpringManagedTransaction : Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f83eb84]
2020-03-22 11:39:13.581 DEBUG 2248 --- [nio-8888-exec-4] org.mybatis.spring.SqlSessionUtils : Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7f1802b5]
看到红色的那行:o.m.s.t.SpringManagedTransaction : Committing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@6f83eb84]
打开SpringManagedTransaction 这个类
private void openConnection() throws SQLException { this.connection = DataSourceUtils.getConnection(this.dataSource); this.autoCommit = this.connection.getAutoCommit(); this.isConnectionTransactional = DataSourceUtils.isConnectionTransactional(this.connection, this.dataSource); LOGGER.debug(() -> { return "JDBC Connection [" + this.connection + "] will" + (this.isConnectionTransactional ? " " : " not ") + "be managed by Spring"; }); } public void commit() throws SQLException { if (this.connection != null && !this.isConnectionTransactional && !this.autoCommit) { LOGGER.debug(() -> { return "Committing JDBC Connection [" + this.connection + "]"; }); this.connection.commit(); } }
虽然 :will not be managed by Spring
但是:在满足条件
if (this.connection != null && !this.isConnectionTransactional && !this.autoCommit) 的时候会执行 this.connection.commit()
也就是说在没有使用spring的事务管理的时候spring会自动的执行commit()
暂时解惑,至于SpringManagedTransaction 类的原理还有待了解
相关推荐
1. 事务管理:多数据源环境下,事务的处理会变得复杂,需要确保在跨数据源的操作中,事务的一致性和隔离性。 2. SQL路由:需要编写能够根据业务逻辑自动选择正确数据源和表的SQL,这可能需要自定义拦截器或切面处理...
在业务代码中,你需要在执行SQL之前设置当前的数据源。可以创建一个ThreadLocal变量来保存数据源信息,比如`DataSourceContextHolder`。 ```java public class DataSourceContextHolder { private static final...
别忘了为每个数据源设置不同的名字,如`primaryDataSource`和`secondaryDataSource`。 4. **创建数据源路由`DataSourceRouter`**:自定义一个实现了`AbstractRoutingDataSource`的类,用于根据业务逻辑选择使用哪个...
总之,通过Spring和MyBatis实现的读写分离,结合动态数据源和适当的事务管理策略,可以有效提高系统性能,同时通过数据库记录合并确保数据一致性。在实际开发中,需要根据项目需求选择合适的数据源管理方案,并注意...
总结来说,"mybaits-spring配置"涉及到的主要知识点包括:Spring的DataSource配置、SqlSessionFactory的创建、Mapper接口的扫描、事务管理器的设置以及AOP事务配置。这些配置使得MyBatis能够无缝融入到Spring环境中...
本项目"springboot + mybatis +mysql+ sqlserver 双数据源"正是针对这种需求的一个解决方案,它利用SpringBoot框架、MyBatis持久层框架以及MySQL和SQLServer两种数据库,实现了数据源的自动切换,以满足不同业务场景...
将基于Spring4.1.7+atomikos+mybaits 实现两阶段的分布式事务处理,通过AOP面向切面实现动态实现数据源的切换 http://www.dczou.com/viemall/407.html
然后,我们需要建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称。最后,我们需要在 spring 配置文件中配置多个数据源。 在 spring 配置文件中,我们需要定义多个数据库的连接信息,例如驱动程序...
4. 配置MyBatis:设置SqlSessionFactory,并确保其使用Atomikos提供的数据源。 5. 开启事务支持:在需要执行分布式事务的Service类中,使用@Transactional注解标注方法,Spring会自动创建并管理事务。 通过以上步骤...
在本项目中,我们主要探讨的是如何利用Spring Boot框架与Mybatis Plus进行多数据源的配置和管理,同时结合MySQL和Oracle两种不同的数据库系统。这是一个典型的企业级应用场景,能够帮助开发者更好地理解和处理多...
1. **MyBatis配置**:了解如何在mybatis-config.xml文件中配置数据源、事务管理器以及环境信息。 2. **Mapper接口与XML映射文件**:学习如何创建Mapper接口和对应的XML文件,定义SQL语句和结果映射。 3. **...
在本文中,我们将深入探讨如何在Spring Boot项目中整合MyBatis框架,使用注解方式进行数据访问,并结合Druid数据源来实现高效的数据管理。首先,我们先了解一下Spring Boot、Spring、Java以及后端开发的基本概念。 ...
确保在每次切换数据源后都正确设置和清除`DataSourceContextHolder`,以防止数据源混淆。同时,合理设计事务边界,确保数据的一致性。 以上内容详细阐述了如何在Spring Boot项目中整合Mybatis并配置连接SQL Server...
<table tableName="your_table_name" domainObjectName="YourClassName" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" ...
这个文件定义了逆向工程的参数,包括数据源信息、生成的目标目录、模板设置等。例如: ```xml <properties resource="generator.properties"> <!-- 数据库连接信息 --> <context id="MySQL" targetRuntime=...
- **environments**:配置多个环境(例如development和production),每个环境可以有不同的数据源和事务管理器配置。 - **dataSource**:指定数据源配置,可以使用内置的数据源或通过JNDI引用外部数据源。 - **...
1. **配置文件**: MyBatis的配置文件(通常命名为`mybatis-config.xml`)是整个框架的中心,它定义了数据源、事务管理器、SqlSessionFactory等关键元素。配置文件中包含了关于数据库连接的信息,例如数据库驱动、URL...
接下来,创建一个配置类`DataSourceConfig.java`,在这里设置两个数据源并配置动态数据源: ```java @Configuration public class DataSourceConfig { @Primary @Bean(name = "primaryDataSource") @...
总结来说,MyBatis的多数据源配置涉及到Spring框架的DataSource配置、MyBatis的SqlSessionFactoryBean设置、自定义RoutingDataSource的实现以及业务代码中数据源的切换。掌握这一技能,能够帮助你在项目中灵活处理多...
手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写mybaits框架代码手写...