事務 保證一組資料庫操作,要麼全部成功,要麼全部失敗。 特性 原子性: 一致性: 隔離性: 持久性: 當資料庫中有多個事務同時執行的時候,就可能出現臟讀( )、不可重覆讀( )、幻讀( )的問題,為瞭解決這些問題,就有了“隔離級別”的概念。隔離的越嚴實,效率就會越低,需要在兩者之間找一個平衡點。 事 ...
事務
保證一組資料庫操作,要麼全部成功,要麼全部失敗。
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
)
每開始一個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。