mybatis如何使用truncate清空表
使用truncate清空表
Mapper接口
void truncateTable();
XML文件
<update id="truncateTable" > TRUNCATE TABLE 表名 </update>
注意:是<update>标签,不是<delete>标签
事务方法中使用truncate会发生什么
场景
在一个spring项目的事务方法中(使用@transactional注解):
- 首先执行一个delete语句;
- 然后执行一个truncate语句;
- 最后再执行一个insert语句;
问题
为什么delete语句和truncate语句执行成功,但insert语句虽然执行了,却没有提交?
解释
首先,在没有事务注解的方法中,一切与数据库的交互都是由mybatis处理的,
而mybatis默认是事务自动提交的,也就是每条sql语句执行完后会立即提交。
在添加事务注解后,应用与数据库的交互会由spring和mybatis共同处理(所以它们要共用同一个数据源):
spring管理事务,mybatis负责具体sql的执行。
那它们是如何协调的呢?
- spring首先会在一开始创建连接开启事务,同时将连接放进当前线程(threadlocal);
- mybatis执行sql语句时会从当前线程获取连接——这样就保证了spring和mybatis使用的是同一个连接;
- mybatis执行sql后,会检查方法上是否有事务注解,如果有的话就不执行commit语句;
最后由spring执行commit。
这也就解释了一开始的问题:
执行完truncate后,当前事务已被提交(truncate虽然性能比delete好,但它是DDL语句,会触发事务提交),后续执行sql时,由于mybatis检测到事务注解所以不会提交
而spring此时早已把事务提交,也不会在方法结束时再一次提交了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java中EnumMap和EnumSet枚举操作类的简单使用详解
这篇文章主要介绍了Java中EnumMap和EnumSet枚举操作类的简单使用详解,EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举 EnumMap不允许键为空,允许值为空,需要的朋友可以参考下2023-11-11
最新评论