事務併發的三大問題
事務隔離級別
mvcc
本文主要介紹mysql innodb儲存引擎的事務併發問題及事務級別
事務需要滿足4大特性,即所謂的acid
原子性(atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾
一致性(consistency)
一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。
拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。注意:事務的一致性一般是由業務來控制的
隔離性(isolation)
隔離性是當多個使用者併發訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。
永續性(durability)
永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。
髒讀乙個事務讀取到了其他事務還未提交的資料,造成讀不一致。這是我們絕對不能容忍的,即事務還沒提交,即有可能被回滾,但是資料可以被其他事務讀取到
不可重複讀
乙個事務讀取到了其他事務已提交的資料造成讀讀不一致(其他資料修改或者刪除導致讀不一致)
幻讀乙個事務讀取到了其他事務插入的資料造成讀不一致(其他資料插入導致讀不一致)
基於事務併發存在的三大問題,那麼我們的資料庫必須要幫我們解決這些問題,所以就出現了標準,即希望資料庫廠商可以實現該標準
sql92 ansi/iso標準,在該標準定義了四大隔離級別應該解決的問題,並且希望資料庫廠商可以實現該標準
read uncommitted (ru 未提交讀)
最低級別,未解決任何併發問題
read committed (rc 已提交讀)
解決髒讀問題
repeatable read (rr 可重複讀)
解決髒讀問題、解決不可重複讀問題
serializable (序列化)
解決髒讀問題、解決不可重複讀問題、解決幻讀問題
那麼mysql中是否有實現這些標準呢,可以看下圖
我們可以看到mysql在innodb的儲存引擎下,在可重複讀(rr)級別就已經幫我們解決了併發讀不一致的三大問題了
所以mysql目前預設的事務隔離級別就是repeatable read,我們可以執行select @@tx_isolation來進行查詢
以上事務隔離級別是為了解決事務讀一致性的問題的,那麼mysql是如何解決這些問題的呢,主要是採用的mvcc的思想來解決
mvcc (multiversion concurrency control) 中文全程叫多版本併發控制,是現代資料庫(包括 mysql、oracle、postgresql 等)引擎實現中常用的處理讀寫衝突的手段,目的在於提高資料庫高併發場景下的吞吐效能。
innodb 中 mvcc 的實現方式為:每一行記錄都有兩個隱藏列:data_trx_id、data_roll_ptr(如果沒有主鍵,則還會多乙個隱藏的主鍵列)。
data_trx_id
記錄最近更新這條行記錄的事務 id,大小為 6 個位元組
data_roll_ptr
表示指向該行回滾段(rollback segment)的指標,大小為 7 個位元組,innodb 便是通過這個指標找到之前版本的資料。該行記錄上所有舊版本,在 undo 中都通過鍊錶的形式組織。
db_row_id
行標識(隱藏單調自增 id),大小為 6 位元組,如果表沒有主鍵,innodb 會自動生成乙個隱藏主鍵,因此會出現這個列。另外,每條記錄的頭資訊(record header)裡都有乙個專門的 bit(deleted_flag)來表示當前記錄是否已經被刪除。
mvcc即是根據data_trx_id和data_roll_ptr根據規則來實現的,這裡不做詳細介紹。
MySQL事務隔離級別及事務併發問題
1 原子性 atomicity 事務一旦開始,那麼我們只能有兩個結果,要麼全部執行完成,要麼全部都不做,不能停滯在事務中途。如果在執行 錯,必須把事務回滾到事務開始前。2 一致性 consistency 事務開始前和結束後,資料庫的完整性約束沒有被破壞 比如買東西,付款的時候,我扣錢成功了,對方也一...
MySQL事務隔離級別 解決併發問題
mysql事務隔離級別 1.髒讀 騙錢的手段,兩個視窗或執行緒分別呼叫資料庫轉賬表,轉賬後未提交,對方檢視到賬後,rollback,實際錢沒轉.演示方法 mysql預設的事務隔離級別為repeatable read 比oracle高,因為mysql本身弱 使用select tx isolation ...
事務併發問題及事務隔離級別的學習
以下內容都是看的咕泡學院的大神老師講的乙個公開課,就是記錄一下。1 髒讀 如下圖,左右兩個事務a b。事務a首先查詢id 1的資料,得到age 16之後,事務b對id 1的資料,將age 16更新為age 18,然後事務a,再查詢id 1的資料,這種在乙個事務裡邊,多次讀取同一條資料,該資料又是在其...