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é)調的呢?
- 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此時早已把事務提交,也不會在方法結束時再一次提交了。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot+vue實現(xiàn)七牛云頭像的上傳
本文將介紹如何在Spring Boot項目中利用七牛云進行圖片上傳并將圖片存儲在云存儲中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08Java中LinkedHashSet的實現(xiàn)原理詳解
這篇文章主要介紹了Java中LinkedHasSet的實現(xiàn)原理詳解,LinkedHashSet?是具有可預知迭代順序的?Set?接口的哈希表和鏈接列表實現(xiàn),此實現(xiàn)與HashSet?的不同之處在于,后者維護著一個運行于所有條目的雙重鏈接列表,需要的朋友可以參考下2023-09-09