您好,登錄后才能下訂單哦!
本篇文章為大家展示了MySQL中有哪些事務隔離級別,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
事務的四大ACID 屬性:Atomicity 原子性、Consistency 一致性、Isolation 隔離性、Durability 持久性。
原子性: 事務是最小的執行單位不可分割,強調事務的不可分割。
一致性: 事務執行前后,數據的完整性保持一致。
持久性: 一旦事務執行結束,數據就保存到數據庫。
隔離性: 一個事務執行的前后不應該受到其他事務的干擾。
MySQL的事務隔離級別有四種:未提交讀、已提交讀、可重復讀和串行化。
未提交讀: 事務A可以讀取到事務B還未提交的數據。比如事務B將小明的賬戶余額從100改到110,事務B還沒提交,在這個隔離級別下事務A就讀取到的數據就是110。如果說事務B回滾了,那數據庫里小明的賬戶余額又變成100了,可是事務A返回的數據卻是110。這就造成了臟讀。
已提交讀: 事務A讀取到數據是事務B提交后的數據,即一個事務提交后,其變更才會被另一個事務讀取到。比如事務B將小明的賬戶余額從100改到110,事務B還沒提交的時候,事務A讀取到的數據仍然是100。因為在這個隔離級別下一個事務只能讀取到另一個事務修改后且提交事務后的數據。但是這種情況會造成一個問題就是,事務A在事務B隱式提交數據后讀取到的數據是110,這是沒問題的,但是在事務A還沒提交前,事務B又將小明的賬戶余額改為120并隱式提交,然后事務A再來讀取的時候就讀到了120,所以事務A的兩次讀取結果不一致。這就造成了不可重復讀。
可重復讀: 事務A只能讀到事務B修改的已提交了事務的數據,但是第一次讀取的數據,即使別的事務修改了這個值,這個事務再讀取這條數據的時候還是和第一次獲取的一樣,不會隨著別的事務的修改而改變。這和已提交讀的區別就在于,它重復讀取的值是不變的。所以叫可重復讀,很貼切的名字。拿剛才的例子就是,事務A在自己的事務里多次讀取小明的賬戶余額時,如果第一次讀取的是100,那么不管在這之后事務B對它進行如何的修改,對于事務A來說多次讀取的結果都是100。可重復讀解決了不可重復讀(聽起來像是廢話),但是存在幻讀的情況。
幻讀:當事務A查詢賬戶余額=100的客戶個數時,假如返回的是1萬,這時事務B將小明的賬戶余額由110改為100并提交事務,事務A再次查詢賬戶余額=100的客戶個數時返回的統計個數變成了1萬零1。這就是幻讀。
幻讀和不可重復讀有區別。不可重復讀側重點在于讀取同一條數據,數據被修改,如讀小明的賬戶余額;幻讀的側重點在于新增或者刪除 (數據條數變化),同樣的條件兩次查詢記錄數不一樣。
串行化: 上面三個隔離級別對同一條記錄的讀和寫都可以并發進行,但是串行化的隔離級別下就只能進行讀-讀并發。只要有一個事務操作一條記錄的寫,那么其他事務要讀這條記錄的事務都得等著。例如,事務B修改小明的賬戶還未提交前事務A來讀,那么事務A就只能等著事務B提交之后才能讀。
串行化的隔離級別一半沒人用,因為性能比較低,常用的是已提交讀和可重復讀。
大多數數據庫采用已提交讀,MySQ的默認隔離級別是:可重復讀。
可以通過 select @@global.tx_isolation;
來查看當前隔離級別。
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
未提交讀 | ? | ? | ? |
已提交讀 | ? | ? | ? |
可重復讀 | ? | ? | ? |
串行化 | ? | ? | ? |
上述內容就是MySQL中有哪些事務隔離級別,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。