MySQL 事務(Transaction)篇(一)

一、事務的定義

1、定義:
事務也稱一個最小的不可再分的工作單元,是由一個或多個SQL語句所組成的操作序列,通常一個事務對應一個完整的業務(insert、update、delete語句共同聯合完成),用來維護數據庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
2、適用場景:

在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務

MySQL 事務主要用於處理操作量大,複雜度高的數據。比如說,媒資管理系統中,我們對視頻源文件進行刪除的同時,你要刪除視頻的元文件信息,也要刪除和改視頻相關的數據記錄。這樣,這些數據庫操作語句就構成一個事務!

二、事務的小例子

比如:張三有20美元,李四有10美元,張三借給李四10美元,算算他們身上此時各有多少大洋?

張三現有:20 - 10 = 10(美元)
李四現有:10 + 10 = 20(美元)

然後我們把它放入數據庫中,怎麼執行上面的加減法計算呢》

update `user` set money=10 where name = "張三";
update `user` set money=20 where name = "李四";

以上兩條SQL語句必須同時成功或者同時失敗,可能上面第一條語句執行了下面的第二條沒有執行,或者執行失敗,因此爲了保證兩條語句要麼都執行,要麼都不執行,這時候就用到了事務。

二、事務的四個特性ACID

原子性:

原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

一致性:

一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。

隔離性:

隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read
uncommitted)、讀提交(read committed)、可重複讀(repeatable
read)和串行化(Serializable)。

持久性:

持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。

三、事務的併發問題

1、髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據

2、不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果 不一致。

3、幻讀:系統管理員A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
  
髒讀、幻讀、不可重複讀,其實都是數據庫讀一致性問題,必須由數據庫提供一定的事務隔離機制來解決。數據庫實現事務隔離的方式,基本上可分爲以下兩種:

 1、在讀取數據前,對其加鎖,阻止其他事務對數據進行修改。
 2、不用加任何鎖,通過一定機制生成一個數據請求時間點的一致性數據快照(Snapshot),並用這個快照來提供一定級別(語句級或事務級)的一致性讀取。從用戶的角度來看,好像是數據庫可以提供同一數據的多個版本,因此,這種技術叫做數據多版本併發控制(MultiVersion Concurrency Control,簡稱MVCC或MCC),也經常稱爲多版本數據庫。

四、事務的隔離級別

四種MySQL事務隔離級別

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章