隔離級別分類
事務隔離級別
髒讀不可重複讀
幻讀讀未提交是是
是不可重複讀否是
是可重複讀否否
是序列化否否
否什麼是幻讀
事務a 按照一定條件進行資料讀取, 期間事務b 插入了相同搜尋條件的新資料,事務a再次按照原先條件進行讀取時,發現了事務b新插入的資料稱為幻讀。
如果事務a 按一定條件搜尋, 期間事務b 刪除了符合條件的某一條資料,導致事務a 再次讀取時資料少了一條,這種情況歸為不可重複讀。
rr隔離級別如何實現
使用mvcc保證快照讀的可重複讀。
間隙鎖保證當前讀的可重複讀。
rr隔離級別下是否會產生幻讀
先使用快照讀,然後使用當前讀(select * from author where id > 5 for update;)會產生幻讀。
只是用一致性讀或者當前讀不會產生幻讀。
mvcc實現原理
使用undo指標儲存舊版本資料,以鍊錶形式連線,資料中記錄操作事務id。
進行快照讀時建立活躍事務id集合,用於判斷某個事務id是否在當前事務開始之前提交。rc隔離級別每次快照讀時重新建立,rr隔離級別第一次快照讀時建立。
可見性,當前事務以及在當前事務開始之前提交的事務的操作(新增,修改,刪除)對當前事務可見。
什麼是行鎖
所有查詢中需要訪問的索引都會加行鎖。
輔助索引會間接對主鍵索引加鎖。
什麼是間隙鎖
間隙鎖的範圍是左右開區間,預設使用next-key鎖(間隙鎖+行鎖,形成半開區間)。
作用:防止其他事物在間隙中執行insert語句或者update到已有間隙中。
產生條件:rr隔離級別 & 當前讀 & 使用索引。
間隙鎖之間相互不阻塞。
根據鎖相容性表可知,間隙鎖的存在就是為了阻塞插入意向鎖,防止產生幻讀。
插入意向鎖
插入意向鎖是乙個間隙鎖,在insert時產生。
多個事務在同時寫入不同資料到同一間隙時,不會發生鎖等待。
不影響其他任意鎖,只對插入的記錄持有乙個記錄鎖。根據鎖相容性表可知,因為間隙鎖相互不阻塞,所以新增插入意向鎖,防止產生幻讀。
鎖相容性表
是否相容(橫向:已有鎖,縱向:新加鎖)
gapinsert intention
record
next-key
gap是是是
是insert intention否是
是否record是是
否否next-key是是
否否
對 MySQL 隔離級別問題怎樣會產生的理解
不同的隔離級別會造成三種問題,髒讀 不可重複讀 幻讀。以下討論是在不使用mvcc多版本控制的情形下產生這三種問題的原因的理解。一開始我總是難以理解這三種問題如何會發生 特別是髒讀 後來想清楚以後覺得最重要的點在於我們思考這個問題的時候要想到一點 所謂的對資料庫資料進行修改或者讀取操作的互斥的問題,其...
linux核心列印級別問題
函式printk的使用方法和printf相似,用於核心列印訊息。printk根據日誌級別 loglevel 對訊息進行分類。日誌級別用巨集定義,日誌級別巨集展開為乙個字串,在編譯時由預處理器將它和訊息文字拼接成乙個字串,因此printk 函式中日誌級別巨集和格式字串間不能有逗號。下面是兩個print...
關於日誌Log的級別問題
關於日誌log的級別問題 背景 使用spark sql過程中,出現乙個需要設定日誌級別的命令 sc.setloglevel warn 而log4j中的日誌級別可分為7類 1.static level debug debug level指出細粒度資訊事件對除錯應用程式是非常有幫助的。2.static ...