mybatis如何使用truncate清空表
使用truncate清空表
Mapper接口
void truncateTable();
XML文件
? <update id="truncateTable" > ? ? TRUNCATE TABLE 表名 ? </update>
注意:是<update>標簽,不是<delete>標簽
事務方法中使用truncate會發(fā)生什么
場景
在一個spring項目的事務方法中(使用@transactional注解):
- 首先執(zhí)行一個delete語句;
- 然后執(zhí)行一個truncate語句;
- 最后再執(zhí)行一個insert語句;
問題
為什么delete語句和truncate語句執(zhí)行成功,但insert語句雖然執(zhí)行了,卻沒有提交?
解釋
首先,在沒有事務注解的方法中,一切與數(shù)據(jù)庫的交互都是由mybatis處理的,
而mybatis默認是事務自動提交的,也就是每條sql語句執(zhí)行完后會立即提交。
在添加事務注解后,應用與數(shù)據(jù)庫的交互會由spring和mybatis共同處理(所以它們要共用同一個數(shù)據(jù)源):
spring管理事務,mybatis負責具體sql的執(zhí)行。
那它們是如何協(xié)調(diào)的呢?
- spring首先會在一開始創(chuàng)建連接開啟事務,同時將連接放進當前線程(threadlocal);
- mybatis執(zhí)行sql語句時會從當前線程獲取連接——這樣就保證了spring和mybatis使用的是同一個連接;
- mybatis執(zhí)行sql后,會檢查方法上是否有事務注解,如果有的話就不執(zhí)行commit語句;
最后由spring執(zhí)行commit。
這也就解釋了一開始的問題:
執(zhí)行完truncate后,當前事務已被提交(truncate雖然性能比delete好,但它是DDL語句,會觸發(fā)事務提交),后續(xù)執(zhí)行sql時,由于mybatis檢測到事務注解所以不會提交
而spring此時早已把事務提交,也不會在方法結(jié)束時再一次提交了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
細致解讀希爾排序算法與相關(guān)的Java代碼實現(xiàn)
這篇文章主要介紹了希爾排序算法與相關(guān)的Java代碼實現(xiàn),希爾排序的時間復雜度根據(jù)步長序列的不同而不同,需要的朋友可以參考下2016-05-05
SpringBoot中properties,yml,yaml的區(qū)別及使用說明
這篇文章主要介紹了SpringBoot中properties,yml,yaml的區(qū)別及使用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
詳解IDEA用maven創(chuàng)建springMVC項目和配置
本篇文章主要介紹了詳解IDEA用maven創(chuàng)建springMVC項目和配置 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
SpringBoot整合RocketMQ實現(xiàn)發(fā)送同步消息
RocketMQ 是一款開源的分布式消息中間件,由阿里巴巴開源,它具有高可用性、高性能、低延遲等特點,廣泛應用于阿里巴巴集團內(nèi)部以及眾多外部企業(yè)的業(yè)務系統(tǒng)中,本文給大家介紹了SpringBoot整合RocketMQ實現(xiàn)發(fā)送同步消息,需要的朋友可以參考下2024-04-04
解析Java的Jackson庫中Streaming API的使用
這篇文章主要介紹了解析Java的Jackson庫中Streaming API的使用,Jackson被用于Java對象和JSON的互相轉(zhuǎn)換,需要的朋友可以參考下2016-01-01

