ddl操作不支援事務 且會提交前面沒有提交的操作

2021-09-27 09:12:14 字數 669 閱讀 5239

在工作中,使用到事務和連線池是再正常不過的了.而我遇到的問題,也正是使用這兩個東西時,沒有注意到一些細節上的東西,就導致了這次踩坑事件.

使用場景: 工作中有這麼乙個業務,就是乙個更改或者建立,需要牽涉到很多張表,還會使用ddl語句動態建立一張新的表.並且需要保證原子性.所以想到的就是使用事務和連線來處理這些東西.

**如下(這裡是測試**,所以值沒有實際意義)

@override

@transactional(rollbackfor = exception.class)

public void test() throws exception

本以為這樣就能完美執行.但如果第三步後面的**出現問題.這時,前面的資料庫操作是已經被提交了的.不能再回退.

原因是,如create等.這種資料庫操作語句是不支援事務的.連帶著,它也會把之前所有的事務一起提交了.即,第二步的建立表語句執行成功,會連帶著把第一步的插入資料一起提交到資料庫,此時,資料也插入到了表中,test_table也建立成功了.如果後面第三步報錯,回滾是不起作用的.已經已經提交了事務.

解決辦法: 最簡單的解決辦法就是把所有的create執行語句放在方法最後面來執行,失敗就丟擲異常來回滾前面所有操作,成功就提交事務.,當然如果執行的順序有要求,那也是可以使用try語句來捕獲異常,然後人為刪除表也是可以的.

支援事務,還是不支援事務?這是乙個問題

時序資料庫是過去幾年內需求成長最旺盛的一類資料庫。在傳統的oltp關係型資料庫領域,已經有了不少標桿型的產品,如oracle,mysql,postgresql等等,因此關於這類資料庫,一些關鍵的設計決策已有公認的解決方案。然而與之不同的是,時序資料庫作為一類新興的資料庫,目前仍可以說是百花齊放,不同...

為什麼Redis事務不支援回滾

redis命令在事務中可能會執行失敗,但是redis事務不會回滾,而是繼續會執行餘下的命令。如果您有乙個關係型資料庫的知識,這對您來說可能會感到奇怪,因為關係型資料在這種情況下都是會回滾的。redis這樣做,主要是因為 只有當發生語法錯誤 這個問題在命令佇列時無法檢測到 了,redis命令才會執行失...

Hive 連線查詢操作(不支援IN查詢)

create external table if not exists a telno string,other string partitioned by day string row format delimited fields terminated by create external ta...