目錄
事務的四大特性
原子性
一致性
持久性
隔離性
事務并發執行
臟讀
不可重復讀
幻讀
四個隔離級別?
read uncommitted
read committed
repeatable read
serializable
事務的四大特性
原子性
- 一個事務中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節
- 事務在執行過程中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務從未發生過一樣
一致性
- 指在數據庫事務執行的過程中,系統從一個一致的狀態轉移到另一個一致的狀態
- 一致性確保了數據庫的完整性和業務規則的正確性
實例理解
- 銀行轉賬事務
- 如果在事務執行前,兩個賬戶的總和是 1000 元,那么在事務執行后,兩個賬戶的總和應該仍然是 1000 元
- 這確保了在任何時刻,數據庫都處于合法、符合業務規則的狀態
持久性
- 事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失
注意:
- 事務在執行的時候,會把執行的過程先記錄到硬盤上,再執行要進行的操作(該記錄不會隨著斷電而丟失)
- 如果一個事務執行到一半 斷電了!
- 等到下次重啟的時候,此時 mysql 就會感知到,上個事務這里執行到了中間狀態
- 就會根據之前記錄的執行過程,進行回滾了!
隔離性
- 數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致
- 事務隔離分為不同級別,包括讀未提交、讀提交、可重復讀、串行化
事務并發執行
- Mysql 是一個關系型數據庫管理系統,其本體為數據庫服務器,該服務器負責存儲、管理、處理數據,并提供了一套 sql?語言接口供客戶端與之交互
- 客戶端通過連接到 Mysql 服務器,可以向服務器發送 sql?語句
- 事務是由一組 sql 語句組成的邏輯工作單元,它要么全部執行成功,要么全部失敗回滾,事務通過執行 sql 語句來對數據庫進行讀取和更新操作
- 在多用戶的數據庫環境中,多個客戶端可以同時連接到數據庫服務器,并發送各自的事務請求,這就是并發執行,即多個事務可以同時在數據庫中執行
- 多個事務同時操作數據庫時可能會發生下述三種問題
臟讀
- 臟讀發生在一個事務讀取了另一個事務還未正式提交的數據,因為存在回滾的可能性
實例理解
解決方法
- 給正在被修改的字段加上?寫鎖
不可重復讀
- 不可重復讀發生在一個事務內的兩次讀取之間,另一個事務修改了數據,導致兩次查詢結果不一致
實例理解
解決方法
- 給正在被查詢的字段加上?讀鎖
幻讀
- 幻讀發生在一個事務內的兩次查詢之間,另一個事務插入或刪除了數據,導致兩次查詢結果不一致
實例理解
解決方法
- 加上讀鎖 無法解決幻讀問題,因為讀鎖僅作用于被查詢的字段,無法被其他事務修改其字段值
- 使用串行化的方式才能解決該問題,即事務必須 串行 執行,不能 并行 執行
四個隔離級別?
- Mysql 提供了四個隔離級別
read uncommitted
- 對事務的并發執行不做任何限制
- 其并發程度最高,隔離性最低
- 會產生臟讀、不可重復讀、幻讀的問題
read committed
- 對寫操作加鎖
- 并發程度降低了,隔離性提高了
- 解決了臟讀的問題,任然存在不可重復讀、幻讀的問題
repeatable read
- mysql 的默認隔離級別
- 對寫和讀都加鎖了
- 并發程度又降低了,隔離性又提高了
- 解決了臟讀、不可重復讀的問題,任然存在幻讀問題
serializable
- 嚴格串行化
- 并發程度最低(串行執行),隔離性最高
- 解決了臟讀、不可重復讀、幻讀的問題
注意:
- 從上到下
- 隔離性依次增高
- 并發性依次降低
- 執行速度依次降低
- 數據可靠性依次提高
總結:
- 在實際的開發中就可以根據當前要解決的問題的需求場景,來決定使用哪個隔離級別
- 如果涉及到 金錢交易 這樣的場景,就可以讓讓并發性低一點,隔離性高一點,以提高精準度
- 如果涉及到 統計點贊數、瀏覽量 這樣的場景 ,就可以讓并發性高一點,隔離性低一點,以提高效率