Mysql事務中的ACID是怎麼實現的

首先明確幾個概念:

事務的四大特徵,redo log,undo log,mysql鎖技術(共享鎖/排他鎖),MVCChtml

四大特性(ACID)

1.原子性(Atomicity)

  原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。失敗回滾的操做事務,將不能對事務有任何影響mysql

2. 一致性(Consistency)

  一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。sql

  例如:A和B進行轉帳操做,A有200塊錢,B有300塊錢;當A轉了100塊錢給B以後,他們2我的的總額仍是500塊錢,不會改變。數據庫

3. 隔離性(Isolation)

  隔離性是指當多個用戶併發訪問數據庫時,好比同時訪問一張表,數據庫每個用戶開啓的事務,不能被其餘事務所作的操做干擾(也就是事務之間的隔離),多個併發事務之間,應當相互隔離。
  例如同時有T1和T2兩個併發事務,從T1角度來看,T2要不在T1執行以前就已經結束,要麼在T1執行完成後纔開始。將多個事務隔離開,每一個事務都不能訪問到其餘事務操做過程當中的狀態;就比如上鎖操做,只有一個事務作完了,另一個事務才能執行。緩存

4. 持久性(Durability)

  持久性是指事務的操做,一旦提交,對於數據庫中數據的改變是永久性的,即便數據庫發生故障也不能丟失已提交事務所完成的改變。併發

redo log

重作日誌,是用來實現事務的持久性。重作日誌緩衝(redo log buffer)(內存中)以及重作日誌文件(redo log)(磁盤中)。當事務提交以後會把全部修改信息都會存到該日誌中。mvc

實例:把張三的銀行帳戶中的餘額轉到他的理財帳戶中。性能

sql實現:
start transaction;
select balance from bank where name="zhangsan";
update bank set balance = balance - 400;
update finance set amount = amount + 400;
commit;

redolog的工做流程圖

 

 

 

 

 

做用:mysql 爲了提高性能不會把每次的修改都實時同步到磁盤,而是會先存到Boffer Pool(緩衝池)裏頭,把這個看成緩存來用。而後使用後臺線程去作緩衝池和磁盤之間的同步。spa

說簡單點就是redolog就是存執行sql的日誌,萬一數據丟失了,能夠從日誌裏讀取,從新執行,保證了事務持久性的特色線程

undo log

回滾日誌,用於記錄數據被修改前的信息。他正好跟前面所說的重作日誌所記錄的相反,重作日誌記錄數據被修改後的信息。undo log主要記錄的是數據的邏輯變化,爲了在發生錯誤時回滾以前的操做,須要將以前的操做都記錄下來,而後在發生錯誤時才能夠回滾。

 

 

 

做用:undo log 記錄事務修改以前版本的數據信息,所以假如因爲系統錯誤或者rollback操做而回滾的話能夠根據undo log的信息來進行回滾到沒被修改前的狀態。

說簡單點就是保存redolog裏面的反向sql日誌,發生異常回滾的時候執行undo log裏面的sql,回滾的事務執行之前,也就是事務回滾的原理,也就是他保證了事務的原子性

Mysql共享鎖/排他鎖

一、共享鎖(shared lock),又叫作"讀鎖":讀鎖是能夠共享的,或者說多個讀請求能夠共享一把鎖讀數據,不會形成阻塞。就是說能夠多我的或者多個線程來讀,可是不能進行寫操做。
二、排他鎖(exclusive lock),又叫作"寫鎖":寫鎖會排斥其餘全部獲取鎖的請求,一直阻塞,直到寫入完成釋放鎖。就是說只能一我的或者一個線程來操做,能夠讀也能夠寫。

總結:經過讀寫鎖,能夠作到讀讀能夠並行,可是不能作到寫讀,寫寫並行。

MVCC

經過數據多版原本作到讀寫分離。從而實現不加鎖讀進而作到讀寫並行。
MVCC在mysql中的實現依賴的是undo log與read view
  undo log :undo log 中記錄某行數據的多個版本的數據。
  read view :用來判斷當前版本數據的可見性

說簡單點就至關於樂觀鎖,有了版本號的概念,每行數據都有版本,只能讀取到與本身版本相同的數據,要是版本不一樣就升級版本

 

 

 

 

事務的隔離性是經過 (讀寫鎖+MVCC)來實現的,而事務的一致性,就是上述所說的redolog,undolog,(讀寫鎖+mvcc)共同來實現的。

Mysql事務的具體使用使用和可能出現的問題以及解決原理見個人另外一篇文章:使用Mysql事務可能出現的問題以及解決原理

相關文章
相關標籤/搜索