MySQL事務隔離級別

2021-10-02 20:27:21 字數 2602 閱讀 3387

原子性(atomicity):事務開始後的所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程**錯,會回滾到事務開始前的狀態,就當所有的操作沒發生過一樣。這是乙個整體,不可分割。

一致性(consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞。比如a轉賬給b,a的錢已經扣了,b不可能沒收到錢。

隔離性(isolation):同一時間只允許乙個事務請求統一資料,不同事務之間彼此沒有任何干擾。比如a正在從一張銀行卡中取錢,在a取錢的過程結束之前,b無法向這張銀行卡轉賬。

永續性(durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,且不能回滾。

髒讀:事務a讀取了事務b更新的資料,但是事務b回滾了,那麼事務a則讀取到的資料是髒資料。

不可重複讀:事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果不一致。

幻讀:事務a將資料庫中所有的資料從數字改為字母,在修改的過程中,事務b插入了一條數字的資料,導致在事務a修改完後發現有一條沒有改過來,如幻覺一樣,所以叫幻讀。

ps

1).不可重複讀側重資料的修改,幻讀是側重資料的新增或刪除。

2).解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀的問題只需鎖表。

可重複讀和幻讀

在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖(悲觀鎖),其它事務無法修改這些資料,就可以實現可重複讀了。但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。

資料庫預設隔離級別: mysql—repeatable-read,oracle,sql server—read commited

為什麼mysql不和oracle一樣,因為在mysql5.0之前,binlog只支援statement這種格式,而這種格式會導致mysql在read-committed級別下主從複製會產生邏輯bug。比如在多事務下,有順序先後的不同的資料更新操作,記錄到binlog的順序會與之相反,從庫同步根據binlog日誌的記錄順序依次執行,就會產生不一樣的結果,導致主從不一致。

解決方案:

現在版本已經有了多種格式的binlog日誌,可以改為row格式,此時基於行的複製,好處是記錄詳細,每次資料更新都會記錄原值,所以不會導致主從複製不一致的問題,但是日誌檔案常比較大。

隔離級別設定為repeatable-read,但是該級別會有間隙鎖(為解決幻讀)。在乙個事務範圍查詢,並請求共享或者排他鎖的時候,innodb會給符合條件的已有資料記錄的索引項加鎖,innodb對於鍵值在查詢條件範圍內但不存在的記錄也會加鎖,叫做「間隙鎖」。在併發時,多個事務同時對乙個區間加上了間隙鎖,就會導致死鎖。

讀未提交會產生髒讀,這是不允許的。

序列化,每次讀操作都會加鎖快照讀失效,一般mysql使用自帶的分布式事務功能時才使用該隔離級別。總的來說,強一致性事務,效能不佳。

1)、rr隔離級別下,由於間隙鎖的存在,在併發情況下死鎖機率大。

2)、rr隔離級別下,條件列未命中索引會鎖表,rc只會鎖行。

在rc隔離級別下,其先走聚簇索引,掃瞄全表,然後mysql會根據過濾條件,將不滿足的用unlock_row方法,把不滿足條件的行記錄釋放鎖。而rr是走聚簇索引,進行全部掃瞄,最後會將整個表鎖上。

3)、rc隔離級別下,半一致性讀(semi-consistent)特性增加了update操作的併發性。

在5.1.15的時候,innodb引入了乙個概念叫做「semi-consistent」,減少了更新同一行記錄時的衝突,減少鎖等待。

所謂半一致性讀就是,乙個update語句,如果讀到一行已經加鎖的記錄,此時innodb返回記錄最近提交的版本,由mysql上層判斷此版本是否滿足update的where條件。若滿足(需要更新),則mysql會重新發起一次讀操作,此時會讀取行的最新版本(並加鎖)!

總結:所以,雖然mysql預設隔離級別為rr,然而由於現如今高併發的現實問題,大部分網際網路專案,mysql採用rc的為主。

q1: 在rc級別下,不可重複讀問題需要解決麼?

a1: 不用解決,這個問題是可以接受的!畢竟你資料都已經提交了,讀出來本身就沒有太大問題!oracle的預設隔離級別就是rc,你們改過oracle的預設隔離級別麼?

q2: 在rc級別下,主從複製用什麼binlog格式?

a2: ok,在該隔離級別下,用的binlog為row格式,是基於行的複製!innodb的創始人也是建議binlog使用該格式!

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL事務隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...

Mysql 事務隔離級別

mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...