MySQL實戰45講之2 事務隔離級別

2022-06-18 03:06:08 字數 1226 閱讀 4629

讀未提交:別人改資料的事務尚未提交,我在我的事務中也能讀到。

讀已提交:別人改資料的事務已經提交,我在我的事務中才能讀到。

可重複讀:別人改資料的事務已經提交,我在我的事務中也不去讀。

序列:我的事務尚未提交,別人就別想改資料。

這4種隔離級別,並行效能依次降低,安全性依次提高。

在實現上,資料庫裡面會建立乙個檢視,訪問的時候以檢視的邏輯結果為準。

在「可重複讀」隔離級別下,這個檢視是在事務啟動時建立的,整個事務存在期間都用這個檢視。

在「讀提交」隔離級別下,這個檢視是在每個 sql 語句開始執行的時候建立的。

「讀未提交」隔離級別下直接返回記錄上的最新值,沒有檢視概念;

而「序列化」隔離級別下直接用加鎖的方式來避免並行訪問。

建立read_view,其實就是當前的事務拍了個快照,會記錄【當前時刻】的一些事務id,包括進行中的、已提交的、尚未開始的等等;引擎可以根據這個read_view + 回滾段,找到【快照時刻】的資料。如果事務期間,我們一直用同乙個read_view去查資料,自然可以保證【可重複讀】了。而【提交讀】是需要【每次都讀到最新已提交】的資料的,所以每次執行sql都建立乙個全新的read_view,以保證該特性。

【提交讀】不建立read_view行不行?不行,因為當前【資料頁】中最新的資料是【有可能未提交】的,沒有read_view作為依據,是無法確定到哪個位置(資料頁/回滾段)找到已提交的資料的。相對地,【未提交讀】則不需要read_view,直接獲取資料頁中最新的資料(不管是否提交,所以有可能會出現髒讀)。

當資料庫中乙個事務a正在修改乙個資料但是還未提交或者回滾,

另乙個事務b 來讀取了修改後的內容並且使用了,

之後事務a提交了,此時就引起了髒讀。

此情況僅會發生在: 讀未提交的的隔離級別.

在乙個事務a中多次運算元據,在事務操作過程中(未最終提交),

事務b也才做了處理,並且該值發生了改變,這時候就會導致a在事務操作

的時候,發現資料與第一次不一樣了。 就是不可重複讀。

此情況僅會發生在:讀未提交、讀提交的隔離級別.

事務a 開啟, 查詢符合條件的資料 ,發現有10條, 準備將這10條記錄修改, 此時事務b開啟, 插入了一條符合事務a查詢條件的記錄. 提交事務, 回到事務a, a也提交事務, 當再次查詢到時候, 發現修改了11條..感覺發生了幻覺一樣. 此為幻讀.

實戰mysql45講 MySQL實戰45講

作者簡介 林曉斌,網名 丁奇 前阿里資深技術專家,曾負責阿里雲rds核心開發團隊和運維團隊,並推動了alisql分支開源。作為活躍的mysql社群貢獻者,丁奇專注於資料儲存系統 mysql原始碼研究和改進 mysql效能優化和功能改進,熱衷於解決mysql疑難問題。課程亮點 你將獲得 前阿里資深技術...

MySQL實戰45講 MySQL筆記之資料庫基礎

連線資料庫 查詢快取,若命中直接返回結果 不推薦使用,更新即失效,利用效率低,8.0已經刪除查詢快取 語法分析 語句優化 查詢儲存引擎 重建表方法 1.alter table t engine innodb 2.optimize table t analyze table t 只重建索引 count...

mysql實戰45講筆記 07

07 行鎖功過 怎麼減少行鎖對效能的影響 mysql的行鎖是在引擎層由各個引擎自己實現的,不是所有資料庫都支援行鎖比如myisam 行鎖就是針對資料表中行記錄的鎖。在innodb事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻回訪,而是等到事務結束時才釋放,這就是兩階段鎖協議。因此,如果事...