首頁 >資料庫 >mysql教程 >MySQL事務的ACID特性及並發問題知識點總結

MySQL事務的ACID特性及並發問題知識點總結

WBOY
WBOY轉載
2022-07-25 17:39:182408瀏覽

這篇文章為大家帶來了關於mysql的相關知識,主要介紹了MySQL事務的ACID特性以及並發問題方案,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小夥伴可以參考一下,希望對大家有幫助。

MySQL事務的ACID特性及並發問題知識點總結

推薦學習:mysql影片教學

#一、交易的概念

##一個交易是由一條或多條對資料庫操作的SQL語句所組成的一個不可分割的單元,只有當事務中所有操作都正常執行完了,整個事務才會被提交給資料庫,如果有部分事務處理失敗,那麼事務就要回滾到最初的狀態,因此,事務要麼全部執行成功,要麼全部失敗。

所以要記住事務幾個基本概念,如下:

事務是一組SQL語句的執行,要麼全部成功,要麼全部失敗,不能出現部分成功,部分失敗的結果,保證事務執行的原子操作。事務的所有SQL語句全部執行成功,才能提交(commit)事務,把結果寫會磁碟上。事務執行過程中,有的SQL出現錯誤,那麼交易就必須回滾(rollback)到最初的狀態。

例如轉帳業務需要多條SQL語句共同完成,只有這些SQL都執行成功才算業務成功了。

事務處理有三個狀態:

#begin:開啟一個交易要執行的全部sql語句都成功了,然後commit提交一個事務如果其中任何一條SQL語句由於停電、或者伺服器出錯,導致SQL執行異常,那事務就沒有提交,事務會回滾(rollback),資料將恢復到交易開始前的狀態

這是儲存引擎來保證的(redo log和undo log保證的)

##MyISAM儲存引擎不支援事務,InnoDB儲存引擎支援事務、支援行鎖。

show engines\G

查看目前資料庫支援哪些儲存引擎。

select @@autocommit;

查看對交易提交狀態的設定

資料庫引擎可以透過命令臨時修改,或透過設定檔永久修改。

如果說我們業務上涉及了事務,我們一般會在程式碼上控制這個變量,一般來說,我們的事務由多條SQL組成,要滿足事務的原子性操作,所以我們設定為手動提交。業務都成功,則提交這個事務;如果業務中間出現失敗,就回滾1個事務。

二、ACID特性

每一個事務必須滿足下面的4個特性:

事務的原子性(Atomic):事務是一個不可分割的整體,事務必須具有原子特性,及當事務修改時,要么全執行,要么全不執行,即不允許事務部分的完成。交易的一致性(Consistency):一個交易執行之前和執行之後,資料庫資料必須保持一致性狀態。資料庫的一致性狀態必須由使用者來負責,並由並發控制機制實現。就拿網路購物來說,你只有讓商品出庫,又讓商品進入顧客的購物車才能構成一個完整的事務。 (一致性不僅體現在事務裡面,包括儲存層引入MySQL為了提高熱點資料的存取效率一般都會加一個緩存層Redis或Memery cache對熱點資料做緩存,這就涉及了快取層和資料庫DB層的數據一致性問題)交易的隔離性(Isolution):當兩個或多個交易並發執行時,為了確保資料的安全性,將一個交易內部的操作與其他交易的操作隔離起來,不被其他正在執行的事務所看到,使得並發執行的各個事務之間不能互相影響。隔離等級:資料的安全性和事務的並發性。隔離越嚴格,安全性越高,並發性越低(就是並發性控制,保證資料安全)事務的持久性(Durability):事務完成以後(事務commit成功),DBMS保證它對資料庫中的資料的修改時永久性的,即使資料庫因為故障出錯,也應該能夠恢復資料。

MySQL最重要的是日誌,不是資料!

事務的ACD特性是由MySQL的redo log和undo log機制來保證的;I隔離性是由mysql事務的鎖定機制來實現保證的。

三、交易並發存在的問題

交易處理不經隔離,並發執行交易時通常會發生以下問題:

髒讀(Dirty Read):一個事務讀取了另一個事務未提交的資料。例如當事務A和事務B並發執行時,當事務A更新後,事務B查詢讀取到A尚未提交的數據,此時事務A回滾,則事務B讀到的數據就是無效的髒數據(事務B讀取了事務A尚未提交的資料不可重複讀取(NonRepeatable Read):一個事務的操作導致另一個事務前後兩次讀到不同的資料。例如當事務A和事務B並發執行時,當事務B查詢讀取數據後,事務A更新操作更改事務B查詢到的數據,此時事務B再去讀該數據,發現前後兩次讀的數據不一樣。 (事務B讀取了事務A已提交的資料虛讀(Phantom Read)幻讀:一個事務的操作導致另一個事務前後兩次查詢的結果資料量不同。例如當事務A和事務B並發執行時,當事務B查詢讀取資料後,事務A新增或刪除了一條滿足事務B查詢條件的記錄,此時事務B再去查詢,發現查詢到前一次不存在的記錄,或是前一次查詢的一些記錄不見了。 (事務B讀取了事務A新增加的資料或讀不到事務A刪除的資料

髒讀必須杜絕,因為事務沒有commit。在某些場景下,不可重複讀取和幻讀是可以允許的(事務已經commit),不一定非要杜絕(透過設定不同的隔離等級來解決),由應用程式場景需求決定。

四、事務相關指令

select @@autocommit;檢視MySQL是否自動提交交易

###################################################################################################################################################################################################### #####0表示手動提交事務,1表示自動提交事務,設定事務提交方式為手動提交(只影響目前session):################### ########推薦學習:###mysql影片教學#######

以上是MySQL事務的ACID特性及並發問題知識點總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除