天天看點

MySQL事務

一、事務(Transaction)及其ACID屬性

事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的ACID屬性:

1.原子性(Atomicity):事務是一個原子操作單元,其對資料的修改,要麼全都執行,要麼全都不執行。

2.一緻性(Consistent):在事務開始和完成時,資料都必須保持一緻狀态。這意味着所有相關的資料規則都必須應用于事務的修改,以保持資料的完整性;事務結束時,所有的内部資料結構(如B樹索引或雙向連結清單)也都必須是正确的。

3.隔離性(Isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的“獨立”環境執行。這意味着事務處理過程中的中間狀态對外部是不可見的,反之亦然。

4.持久性(Durable):事務完成之後,它對于資料的修改是永久性的,即使出現系統故障也能夠保持。

二、并發事務處理帶來的問題

相對于串行處理來說,并發事務處理能大大增加資料庫資源的使用率,提高資料庫系統的事務吞吐量,進而可以支援更多的使用者。但并發事務處理也會帶來一些問題,主要包括以下幾種情況。

1.髒讀(Dirty Reads):一個事務可以讀取另一個尚未送出事務的修改資料。

2.不可重複讀(Non-Repeatable Reads):同一個事務中,多次查詢某個資料,卻得到不同的結果。

3.幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的資料,卻發現其他事務插入了滿足其查詢條件的新資料。

不可重複讀的和幻讀很容易混淆,不可重複讀側重于修改,幻讀側重于新增或删除。解決不可重複讀的問題隻需鎖住滿足條件的行,解決幻讀需要鎖表。

三、事務隔離級别

“髒讀”、“不可重複讀”和“幻讀”,其實都是資料庫讀一緻性問題,必須由資料庫提供一定的事務隔離機制來解決。資料庫實作事務隔離的方式,基本上可分為以下兩種:

1.在讀取資料前,對其加鎖,阻止其他事務對資料進行修改。

2.不用加任何鎖,通過一定機制生成一個資料請求時間點的一緻性資料快照(Snapshot),并用這個快照來提供一定級别(語句級或事務級)的一緻性讀取。從使用者的角度來看,好像是資料庫可以提供同一資料的多個版本,是以,這種技術叫做資料多版本并發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也經常稱為多版本資料庫。

資料庫的事務隔離越嚴格,并發副作用越小,但付出的代價也就越大,因為事務隔離實質上就是使事務在一定程度上 “串行化”進行,這顯然與“并發”是沖突的。同時,不同的應用對讀一緻性和事務隔離程度的要求也是不同的,比如許多應用對“不可重複讀”和“幻讀”并不敏感,可能更關心資料并發通路的能力。

為了解決“隔離”與“并發”的沖突,ISO/ANSI SQL92定義了4個事務隔離級别,每個級别的隔離程度不同,允許出現的副作用也不同,應用可以根據自己的業務邏輯要求,通過選擇不同的隔離級别來平衡 “隔離”與“并發”的沖突。下表很好地概括了這4個隔離級别的特性:

MySQL事務

檢視更多:

MySQL優化

MySQL各存儲引擎

MySQL鎖詳解

MySQL索引類型

參考資料:《深入淺出MySQL》

  • 作者:成九
  • 出處:https://luyucheng.cnblogs.com
  • 若無特别說明均為原創作品,如需轉載請注明原文連結

如果您覺得本文對您的學習有所幫助,可通過支付寶來打賞部落客,增加部落客的寫作動力

MySQL事務