一、事務的基本要素(ACID)
1.原子性(Atomcity):事務開始後的所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。若執行期間出錯,會回滾到事務開始前的狀態。也就是說事務是一個不可分割的整體,有始有終。
2.一致性(Consistency):事務開始前和結束後,數據庫的完整性和一致性不會受到破壞。
3.隔離性(Durability):同一時間,只允許衣蛾事務請求同一數據,不同的事務之間彼此沒有任何干擾。
4.持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。
二、mysql併發時會產生的問題
1.髒讀:事務A讀取了事務B更新的數據,然後B進行了回滾操作,那麼A讀取的數據就爲髒數據。
2.不可重複讀:事務A多次讀取同一數據時,事務B對這份數據進行了更新且進行了提交,導致事務A多次讀取該數據時前後結果不一致。
3.幻讀:事務A讀取一份數據後,事務B對這份數據增加或者刪除了記錄並且提交,當事務A再次讀取該數據後,發現倆次查詢結果不一致。
不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
三、事務的隔離級別
通過設置事務的隔離等級,則可相應的避免上述問題。
事務的隔離級別:
隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
讀未提交(read uncommitter)1 | ✔️ | ✔️ | ✔️ |
讀提交(read committed)2 | ❌ | ✔️ | ✔️ |
可重複讀(repeatable read)4 | ❌ | ❌ | ✔️ |
串行化(serialzable)8 | ❌ | ❌ | ❌ |
mysql查詢當前隔離級別: select @@tx_isolation
mysql設置事務隔離級別:set session transaction isolation level xxxx;