事務
保證一組資料庫操作,要么全部成功,要么全部失敗,
ACID特性
- 原子性:
Atomicity - 一致性:
Consistency - 隔離性:
Isolation - 持久性:
Durability
當資料庫中有多個事務同時執行的時候,就可能出現臟讀(dirty read)、不可重復讀(non-repeatable read)、幻讀(phantom read)的問題,為了解決這些問題,就有了“隔離級別”的概念,隔離的越嚴實,效率就會越低,需要在兩者之間找一個平衡點,
事務隔離級別
隔離級別:串行化 > 可重復讀 > 讀提交 > 讀未提交
- 讀未提交:
read uncommitted,一個事務還沒提交時,它做的變更就能被別的事務看到,會導致“臟讀”、“幻讀”、“不可重復讀”, - 讀提交:
read committed,一個事務提交之后,它做的變更才會被其他事務-看到,避免了“臟讀”,但不能避免“幻讀”和“不可重復讀”, - 可重復讀:
repeatable read,一個事務執行程序中看到的資料,總是跟這個事務在啟動時看到的資料時一致的,當然在可重復讀的隔離級別下,未提交變更對其他事務也是不可見的,MySQL的默認級別, 避免了“臟讀”和“不可重復讀”,但不能避免“幻讀”, - 串行化:
serializable,對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”,當出現讀寫沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行,能比秒“臟讀”、“幻讀”、“可重復讀”,
不同事務級別帶來的并發問題
- 臟讀:讀取到了別的事務回滾前的臟資料,事務A讀取了被另一個事務B修改,但是還未提交的資料,假如事務B回退,則事務A讀取的是無效資料,
- 不可重復讀:當前事務進行了一次資料讀取,然后再次讀取的資料是別的事務修改成功的資料,導致兩次讀取到的資料不匹配
- 幻讀:當兩個完全相同的查詢執行時,第二次查詢所回傳的結果集和第一個查詢的不相同,
MVVC概念
Multi-Version Concurrency Cotrol,多版本并發控制,直白的意思是同一份資料臨時保留多個版本,進而實作并發控制,
在MySQL中建表時,每個表都會有三列隱私欄位,其中和MVCC有關系的有兩列:
- 資料行的版本號(
DB_TRX_ID) - 洗掉版本號(
DB_ROLL_PT)
每開始一個新的事務,系統版本號都會自動遞增,事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/62710.html
標籤:MySQL
上一篇:日志系統(2)
下一篇:索引上(4)
