温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mybatis怎么使用truncate清空表

发布时间:2022-03-14 09:20:25 来源:亿速云 阅读:3562 作者:小新 栏目:开发技术

小编给大家分享一下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语句时会从当前线程获取连接&mdash;&mdash;这样就保证了spring和mybatis使用的是同一个连接;

mybatis执行sql后,会检查方法上是否有事务注解,如果有的话就不执行commit语句;

最后由spring执行commit。

这也就解释了一开始的问题:

执行完truncate后,当前事务已被提交(truncate虽然性能比delete好,但它是DDL语句,会触发事务提交),后续执行sql时,由于mybatis检测到事务注解所以不会提交

而spring此时早已把事务提交,也不会在方法结束时再一次提交了。

看完了这篇文章,相信你对“mybatis怎么使用truncate清空表”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI