事務的隔離級別

2021-09-07 09:38:55 字數 1867 閱讀 8668

sql標準定義的四個隔離級別:

1.read uncommitted(讀取未提交的內容-髒讀)

2.read committed

3.repeatable read

4.serializable

檢視當前會話的事務隔離級別和全域性的事務隔離級別:

1.read uncommitted(讀取未提交的內容-髒讀)

在該隔離級別下,所有事務都可以看到其他未提交事務的執行結果。

我們先將事務隔離級別設定為read uncommitted

然後開啟兩個事務進行操作

由此,我們就了解了什麼是read-uncommitted

2.read committed(讀取提交的內容)

這是大多數資料庫的預設隔離級別(但不是mysql預設的)。read-committed,見名知義:乙個事務只能

讀取已經提交過的事務所操作的資料改變。話不多說,上圖:

3.repeatable read(可重複讀)

這是mysql的預設隔離級別,它能夠確保同一事物的多個例項再併發讀取資料時,能夠看到相同的資料行。

乙個事務在執行過程中,可以看到其他事務已經提交的新插入的記錄,但是不能看到其他事務對已有記錄的更新。

但是理論上,這會導致另乙個棘手的問題:幻讀。

幻讀:當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料航時,

會發現有新的「幻影」行。

innodb和falcon儲存引擎通過多版本併發控制(mvcc)機制解決了該問題,這個我們之後再談。

即:innodb會保證,乙個事務在執行過程中,不能看到其他事務對資料的修改與增刪。

說到這裡,我們可能會思考乙個問題,innodb是如何解決 幻讀 這個問題的?

結論:innodb通過next-key lock解決了當前讀時的幻讀問題(暫不深入)

next-key lock:行鎖與間隙鎖組合起來用就叫做next-key lock。鎖定乙個範圍,並且鎖定記錄本身。對於行的查詢,都是採用該方法,主要目的是解決幻讀的問題。詳見:

4.serializable(序列化執行)

這是最高得隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。

innodb儲存引擎會對每個select語句後自動加上lock in share mode,即為每個讀取操作加上乙個共享鎖,因此在這個級別,可能導致大量的超時現象和鎖競爭。

乙個事務在執行過程中,完全看不到其他事務對資料庫所做的更新操作。當兩個事務同事運算元據庫中相同的資料庫中

相同的資料時,如果第乙個事務已經在訪問該資料,第二個事務只能停下來等待,必須等到第乙個事務結束後才能恢復,

因此在此隔離級別下,事務實際上是序列化執行方式。

參考:《mysql技術內幕》

《mysql 事務的隔離級別》

《mysql(innodb)如何避免幻讀》

《mysql官網文件》

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

事務的隔離級別舉例 JDBC 事務隔離級別

本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...

事務的隔離級別舉例 JDBC事務隔離級別

一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...