通俗易懂的MySQL事務隔離

2021-10-04 07:56:43 字數 2501 閱讀 3022

事務(transaction)是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行邏輯單元。 僅從其定義來看,你可能難以理解什麼是事物,接下來我們舉個經典例子來說明事務的用途:

使用者a向使用者b轉賬,我們需要進行以下操作:從a賬戶中把餘額讀出來;對a賬戶做減法操作;把結果寫回a賬戶中;從b賬戶中把餘額讀出來;對b賬戶做加法操作;把結果寫回b賬戶中。

在以上這些操作中需要保證所有操作是乙個整體,即:要麼都成功,要麼都不成功。 為了解決這種問題,我們引入了事務

資料庫事務擁有以下4大特性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。

1. 原子性

原子性是指事務是乙個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。

簡單來說就是操作成功了就成功了,一旦操作失敗了就會放棄事務中已經執行的操作,回到事務剛開始的狀態。

2. 一致性

一致性是指在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。這是說資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性。

一致性就是說不管操作是否成功,總的資料不會發生改變。例如,a向b轉賬,a和b的總金額不發生變化。

3. 隔離性

多個事務併發訪問時,事務之間是隔離的,乙個事務不應該影響其它事務執行效果。

例如,a在轉賬1億給b(事務1),同時c又在轉賬3億給a(事務2),不管事務1和事務2誰先執行完畢,最終結果必須是a賬戶增加2億(而不是3億),b增加1億,c減少3億。

事務最複雜問題都是由事務隔離性引起的。完全的隔離性是不現實的,完全的隔離性(序列化)要求資料庫同一時間只執行一條事務,而這將會嚴重影響效能。

4. 永續性

永續性,意味著在事務完成以後,該事務對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。也就是說,完成的事務是系統永久的部分,對系統的影響是永久性的,該影響即使出現致命的系統故障也將會一直保持。

更新丟失:當事務1更新失敗時會回滾資料,而在回滾之前事務2若成功更新資料,則事務2更新成功後的資料會被回滾覆蓋,造成更新丟失。

髒讀:當事務1讀取了事務2未提交的資料,而事務2執行失敗進行回滾,則事務1讀取到是資料就是無中生有的資料,即髒資料。

不可重複讀:事務1讀取某個資料後,事務2對其做了修改,當事務1再次讀該資料時得到與前一次不同的值。

幻讀:事務1讀取在讀取某範圍資料時,事務2插入一條資料,當事務1再次讀取這個範圍資料時就不一樣了,出現了一些幻資料。

例如:a先把所有人的餘額清零,同時,b往表中插入了一條餘額為100的資料。a提交以後,發現竟然還有100的資料,即發生幻讀。

隔離性

隔離性是通過鎖實現的,當乙個事務對某項資料進行更新操作的時候就會對資料加鎖,從而防止其他事務對該資料的影響,鎖的級別一般有3種,全域性鎖,表鎖,行鎖,mysql中的innodb支援以上的三種鎖,myisam不支援行鎖。鎖獲取的時機是事務執行的第一句才開始鎖住資料的,並不是在資料開啟的時候獲取的,當事務提交成功後才會釋放鎖。

隔離級別

隔離級別有4種從低到高分別是讀未提交(read uncommitted)、讀提交(read committed)、重複讀(repeatable read)、序列化(serializable)。

讀未提交(read uncommitted)

從名稱中就可以看出,讀未提交,即乙個事務可以讀另乙個事務未提交的資料,簡單來說就是乙個事務修改了某個資料,當它還沒提交的時候,另乙個事務讀取該資料的時候,會讀取到修改後的資料,即使修改的事務還沒有提交。這種隔離級別解決了更新丟失,當乙個事務寫時其他事務可讀不可寫

讀提交(read committed)

從名稱也可以看出來,讀提交,乙個事務要等另乙個事務提交後才能讀取資料,即事務期間獨佔資料,其他資料不能對該資料進行讀寫操作。這種級別解決了髒讀和更新丟失,當乙個事務寫時其他事務不可讀寫

重複讀(repeatable read)

重複讀,即乙個事務重複讀的資料是相同的,就是當乙個事務對資料進行讀操作的時候,其他事務不能對其進行修改但可讀。這種隔離級別解決了髒讀,更新丟失和不可重複讀,一事務讀時其他事務可讀不可寫

序列化(serializable)

這是最高的隔離級別,所有的事務只能乙個接乙個的執行,可以避免髒讀、不可重複讀與幻讀。但這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。

下面總結一下各種隔離級別可避免的問題:

通俗易懂 徹底搞清Mysql事務的四種隔離級別

上網找資料學習,過多的專業術語讓人看得頭大難以專注持久閱讀,本人想總結一篇部落格讓自己永遠記住這些概念,廢話不多說,通俗易懂 並茂來徹底理解四種事務隔離級別 讀未提交 read uncommitted 不可重複讀 read committed 可重複讀 repeatable read 序列化 ser...

numpy bincount 通俗易懂

bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...

通俗易懂的C STL

泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...