一、實體插入資料庫固化後返回資料的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...