記Mybatis獲取自增ID失效BUG

2021-09-12 02:59:25 字數 1230 閱讀 7506

一、實體插入資料庫固化後返回資料的id

二、在測試環境中沒有問題 在生產環境會發現 entity.getid() 返回 正確的id ,但是在同乙個事務下通過id去獲取該行資料 並沒有返回資料 total:0 

三、經排查是由於測試環境和生產環境的mysql 資料庫隔離界別原因

select @@tx_isolation
測試環境 

>  'repeatable-read'
生產環境

> 'read commited'
read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

四 、解決方案

設定生產環境資料庫隔離級別

set session transaction isolation level repeatable read;

獲取自增主鍵id

最近在看隊友的 發現個問題,後覺是自己out了。在做關聯表插入操作時,需要根據主表的 主鍵id作詳情表的屬性值,最笨的方法就是,先插入主表,然後通過查詢返回剛剛插入的 主鍵id,繼續 新增詳情表資料。下面介紹一下我從隊友 中get的新技能 方案 在mybatis的配置檔案中,有個叫keyproper...

Hibernate jpa獲取自增主鍵Id

專案中使用spring hibernate jpa。有場景需要儲存實體後獲取實體的主鍵進行下一步的操作。經過查詢資料以及參考通過修改主鍵註解的方式。即 documentid id generatedvalue strategy generationtype.identity private long...

JAVA MYSQL 插入資料後獲取自增ID

sql insert into mysqldb.gettable mysqldb.game reward uid,from id,from moudle,moudle id,type,num,name,info,start time point,end time point,getted value...