mybatis如何使⽤truncate清空表
⽬录
使⽤truncate清空表
Mapper接⼝
XML⽂件
事务⽅法中使⽤truncate会发⽣什么
场景
问题
解释
使⽤truncate清空表
Mapper接⼝
void truncateTable();
XML⽂件
<update id="truncateTable" >
TRUNCATE TABLE 表名
</update>
注意:是<update>标签,不是<delete>标签
事务⽅法中使⽤truncate会发⽣什么
场景
在⼀个spring项⽬的事务⽅法中(使⽤@transactional注解):
⾸先执⾏⼀个delete语句;
然后执⾏⼀个truncate语句;
最后再执⾏⼀个insert语句;
问题
为什么delete语句和truncate语句执⾏成功,但insert语句虽然执⾏了,却没有提交?
解释
⾸先,在没有事务注解的⽅法中,⼀切与数据库的交互都是由mybatis处理的,truncate多张表加逗号吗
⽽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此时早已把事务提交,也不会在⽅法结束时再⼀次提交了。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。