mysql 事務隔離機制及併發可能產生的問題

2021-10-10 21:27:57 字數 1556 閱讀 3006

事務的4大特性:

原子性:乙個事務是不可分割的工作單位,其中的操作要麼做,要麼不做;如果事務中乙個sql執行失敗,那麼已經執行的sql必須回滾,資料庫退回到事務前的狀態。

一致性:是指事務中的方法要麼同時成功,要麼同時失敗。

隔離性:事務的內部操作與其他事務是隔離的,併發執行的時候各個事務互不干擾。

持久化:事務一但提交,它對資料庫的改變是永久的。

事務在併發中可能產生的問題:髒讀、不可重複讀、幻讀。

髒讀:在事務a中讀到事務b中沒有提交的資料。

不可重複讀:再事務a兩次讀取同一資料,兩次讀取的資料不一致。 兩者的區別是前者是其他事務未提交的資料,後者讀到是其他事務提交的資料。

幻讀:在事務a兩次按照同乙個條件查詢資料庫,兩次查詢結果的條數不一致 。與前者的區別是,前者資料變了,後者資料行數變了

事務的隔離級別:innodb 預設可重複讀

讀未提交:髒讀、不可重複讀、幻讀

讀已提交:不可重複讀、幻讀

可重複讀:幻讀

序列化:都不會

innodb可重複讀是通過mvcc多版本的併發控制和加鎖的方式來解決 髒讀、不可重複讀、幻讀的。

mvcc最大的優點是讀不加鎖,因此讀寫不衝突,併發效能好。其核心技術:

事務版本號:每次事務開啟都會從資料庫獲取乙個自增的事務id,可以從事務id來判斷事務執行的先後順序

表隱藏列:innodb中每行資料都有隱藏列,隱藏列包含本行資料的事務id,指向undo log 的指標等

undo log版本鏈:主要用來記錄資料被修改之前的日誌,在表資訊修改之前會把資料copy到undo log中,當事務回滾的時可以通過undo log的日誌來進行資料還原。事務的原子性實現原理就是通過undo log 來實現的。前面說的每行資料的隱藏列都包含執行undo log 的指標,而每條undo log也指向更早版本的undo log,從而形成乙個版本鏈。

read view:通過隱藏列和undo log 版本鏈可以將資料恢復到指定版本,但具體是哪個版本,則需要根據readview來確定。所謂readview,就是事務在某一刻給整個事務系統打快照,之後在進行讀操作時,會將讀到資料中的事務id與trx_sys(事務系統)快照比較,從而判斷資料對該readview是否可見,及對事務是否可見。

加鎖:鎖是基於索引來實現的,鎖記錄其實就是鎖索引。 

一種是共享鎖(讀鎖)讀取 select ... lock in share mode,

一種是排它鎖(寫鎖)讀取 select ... for update。

由於鎖的性質,當事務對資料進行加鎖時,其他事務不能對其寫操作,因此可以避免髒讀和不可重複讀。

而避免幻讀,則需要通過next_key lock。next_key lock是行鎖的一種,實現相當於 record lock(記錄鎖)+ gap lock(間隙鎖);其特點是不僅會鎖住記錄本身,還會鎖定乙個範圍。因此,加鎖同樣可以避免髒讀、不可重複讀、幻讀。

Mysql事務隔離機制

了解mysql事務隔離機制首先需要理解什麼是acid a 原子性automicity,乙個事務作為不可分割的最小單元,乙個事務裡面的所有操作要麼全部成功,要麼全部失敗。c 一致性consistency,事物結束後系統狀態是一致的,即 資料不能平白無故的產生,也不能平白無故的消失,例如乙個轉賬業務事務...

mysql事務隔離級別及傳播機制

transaction 事務隔離級別 在說明事務隔離級別之前先說一下髒讀 不可重複讀 幻讀這三個概念。髒讀 乙個事務讀取到另一事務未提交的更新新據。當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有 提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒...

MySQL事務隔離級別及事務併發問題

1 原子性 atomicity 事務一旦開始,那麼我們只能有兩個結果,要麼全部執行完成,要麼全部都不做,不能停滯在事務中途。如果在執行 錯,必須把事務回滾到事務開始前。2 一致性 consistency 事務開始前和結束後,資料庫的完整性約束沒有被破壞 比如買東西,付款的時候,我扣錢成功了,對方也一...