未启用Spring事务管理 执行mapper.xml文件的sql,为什么会自动提交
自动提交模式下的行为
JDBC默认自动提交机制
若未显式开启事务管理(即未配置@EnableTransactionManagement),JDBC连接默认处于自动提交模式(autoCommit=true),此时每条SQL语句执行后会立即提交,不会调用doCommit()方法
。例如直接通过JdbcTemplate执行INSERT语句会立即生效。
JDBC事务控制
若未启用Spring事务管理,JDBC默认自动提交(autoCommit=true),每条SQL独立执行后立即提交;启用事务后,Spring会通过DataSourceTransactionManager接管连接,关闭自动提交并在事务完成后调用doCommit()
MyBatis集成场景
MyBatis自身不控制autoCommit属性,而是直接继承JDBC连接的默认配置(通常为true)。当通过SqlSession执行SQL时,若未开启事务,每条语句会立即提交。跳过DataSourceTransactionManager的事务控制流程。此时即使存在DataSourceTransactionManager实例,也不会触发其doCommit()方法。
手动关闭自动提交的情况
连接池配置覆盖
若在数据源配置中显式设置autoCommit=false(如HikariCP的autoCommit参数),则需通过编程式事务或@Transactional注解显式提交,否则SQL执行后不会自动提交,但也不会触发doCommit(),可能导致连接泄漏或数据未持久化。
特殊框架行为
某些数据库操作(如达梦数据库的作业配置)要求关闭自动提交,此时若未启用事务管理,会直接抛出异常而非执行doCommit()。