首先明確幾個概念:
事務的四大特征,redo log,undo log,mysql鎖技術(共享鎖/排他鎖),MVCC
四大特性(ACID)
1.原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,失敗回滾的操作事務,將不能對事務有任何影響,
2. 一致性(Consistency)
一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態,
例如: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)(磁盤中),當事務提交之后會把所有修改資訊都會存到該日志中,
實體:把張三的銀行賬戶中的余額轉到他的理財賬戶中,


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(緩沖池)里頭,把這個當作快取來用,然后使用后臺執行緒去做緩沖池和磁盤之間的同步,
說簡單點就是redolog就是存執行sql的日志,萬一資料丟失了,可以從日志里讀取,重新執行,保證了事務持久性的特點,
undo log
回滾日志,用于記錄資料被修改前的資訊,他正好跟前面所說的重做日志所記錄的相反,重做日志記錄資料被修改后的資訊,undo log主要記錄的是資料的邏輯變化,為了在發生錯誤時回滾之前的操作,需要將之前的操作都記錄下來,然后在發生錯誤時才可以回滾,

作用:undo log 記錄事務修改之前版本的資料資訊,因此假如由于系統錯誤或者rollback操作而回滾的話可以根據undo log的資訊來進行回滾到沒被修改前的狀態,
說簡單點就是保存redolog里面的反向sql日志,發生例外回滾的時候執行undo log里面的sql,回滾的事務執行以前,也就是事務回滾的原理,也就是他保證了事務的原子性,
Mysql共享鎖/排他鎖
1、共享鎖(shared lock),又叫做"讀鎖":讀鎖是可以共享的,或者說多個讀請求可以共享一把鎖讀資料,不會造成阻塞,就是說可以多個人或者多個執行緒來讀,但是不能進行寫操作,
2、排他鎖(exclusive lock),又叫做"寫鎖":寫鎖會排斥其他所有獲取鎖的請求,一直阻塞,直到寫入完成釋放鎖,就是說只能一個人或者一個執行緒來操作,可以讀也可以寫,
總結:通過讀寫鎖,可以做到讀讀可以并行,但是不能做到寫讀,寫寫并行,
MVCC
通過資料多版本來做到讀寫分離,從而實作不加鎖讀進而做到讀寫并行,
MVCC在mysql中的實作依賴的是undo log與read view
undo log :undo log 中記錄某行資料的多個版本的資料,
read view :用來判斷當前版本資料的可見性
說簡單點就相當于樂觀鎖,有了版本號的概念,每行資料都有版本,只能讀取到與自己版本相同的資料,要是版本不同就升級版本

事務的隔離性是通過 (讀寫鎖+MVCC)來實作的,而事務的一致性,就是上述所說的redolog,undolog,(讀寫鎖+mvcc)共同來實作的,
Mysql事務的具體使用使用和可能出現的問題以及解決原理見我的另一篇文章:使用Mysql事務可能出現的問題以及解決原理
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/253942.html
標籤:其他
