Spring事務隔離等級

2021-07-02 14:38:35 字數 1326 閱讀 7995

首先了解事務訪問資料庫讀取資料會出現的情況

1、髒讀 dirty reads

事務a的未提交(還依然快取)的資料被事務b讀走,此時事務a提交失敗,資料回滾,會導致事務b所讀取的的資料是快取中的錯誤資料。

2、不可重複讀 non-repeatable reads

在a事務內,多次讀同一資料。a事務還沒有結束時,另外乙個b事務也訪問該資料,並做了修改。那麼,a事務兩次讀到的的資料可能是不一樣的,造成a事務不能讀取原始資料,即為不可重複讀。

3、幻讀 phantom reads

幻讀與不可重複讀相似,但處理資料是基於資料集上的。如,在a事務內,多次查詢乙個表,並修改所查詢資料,首次查詢出的資料為100條做出了修改,a事務沒有結束,此時b事務對該錶插入了一條資料,當a事務再次查詢該錶時,發現查詢出來有新的資料沒有被修改,造成a事務多次查詢不一致,像產生幻覺一樣。

不可重複讀的重點是修改:

同樣的條件,你讀取過的資料,再次讀取出來發現值不一樣了

幻讀的重點在於新增或者刪除:

同樣的條件,第1次和第2次讀出來的記錄數不一樣

在不同情況下,針對上述現象,spring事務的isolation屬性提供5中事務設定

1、default:使用資料庫設定的隔離級別 ( 預設 ) ,由 dba 預設的設定來決定隔離級別

2、serializable:最嚴格的級別,事務序列執行,資源消耗最大;

3、repeatable read:保證了乙個事務不會修改已經由另乙個事務讀取但未提交(回滾)的資料。避免了「髒讀取」和「不可重複讀取」的情況,但是帶來了更多的效能損失。

4、read committed:大多數主流資料庫的預設事務等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了「髒讀取」。該級別適用於大多數系統。

5、read uncommitted:保證了讀取過程中不會讀取到非法資料。隔離級別在於處理多事務的併發問題。

級別範圍如下表

髒讀不可重複讀

幻讀serializable

不會不會

不會repeatable read

不會不會

會read committed不會會

會read uncommitted會會

spring事務傳播行為與事務隔離等級

propagation屬性的傳播行為 required 指定當前方法必需在事務環境中執行,如果當前有事務環境就加入當前正在執行的事務環境,如果當前沒有事務,就新建乙個事務。這是預設值。supports 指定當前方法加入當前事務環境,如果當前沒有事務,就以非事務方式執行。mandatory 指定當前方...

Mysql 事務隔離等級

1.未提交讀 2.提交讀 rc 不可避免 幻讀 3.可重複讀 rr 讀的資料存在快照中 臨鍵鎖 意向 排他 來避免 幻讀 4.序列化 髒讀 rc的情況下,有資料修改,2次讀取的結果不一致 幻讀 rc 情況下,有新資料 插入,2次讀取結果不一致 a.為了解決幻讀問題,innodb引入了gap鎖。在事務...

SpringBoot設定事務隔離等級

spring boot 使用事務非常簡單,首先使用註解 enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 transactional 便可。在下文中會有圖例 關於事務管理器,不管是jpa還是jdbc等都實現自介面 platform...