mysql事務、髒讀、幻讀

什麼是事務?

百度百科

事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transactionend transaction語句(或函數調用)來界定。事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。

關係數據庫中,一個事務可以是一條SQL語句,一組SQL語句或整個程序。

事務是恢復和併發控制的基本單位。

事務通常以begin(start) transaction 開始,以commit 或 rollback 結束。 
commit 表示提交,將事務中所有對數據庫的更新寫到磁盤,事務正常結束。 
rollback表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的所有已完成的操作全部撤消,滾回到事務開始的狀態。

事務包括哪些屬性?

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱爲ACID特性

  • 原子性(atomicity):一個事務是一個不可分割的工作單位,事務中包括的操作要麼都做,要麼都不做。
  • 一致性(consistency):事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
  • 隔離性(isolation):一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
  • 持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

其中比較重要的就是事務的隔離性,尤其是在高併發情況下,需要深入理解隔離性。

事務的隔離性有哪些級別?

隔離性就是指在併發情況下,不同事務對同一個數據的隔離水平。SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。mysql有四種隔離級別。

  1. 讀未提交(Read Uncommitted):事務A可以讀取到事務B未提交的數據,引發髒讀。本隔離級別很少用於實際應用,因爲它的性能也不比其他級別好多少。
  2. 讀已提交(Read Committed):事務A只能看到事務B提交後的數據。會導致不可重複讀(即同一事務執行完全相同的select語句時可能看到不一樣的結果,導致這種情況的原因可能有:(1)有一個交叉的事務有新的commit,導致了數據的改變;(2)一個數據庫被多個實例操作時,同一事務的其他實例在該實例處理其間可能會有新的commit,多個commit提交時,只讀一次出現結果不一致)。這是大多數數據庫默認的隔離級別,但mysql默認是RR。
  3. 可重複讀(Repeatable Read):保證同一事務的多個併發實例看到的數據是一致的。此級別可能出現的問題--幻讀(Phantom Read),當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行,行數不一致。InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。這是mysql默認的隔離級別。
  4. 可串行化(Serializable):這是最高的隔離級別。它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它在每個讀的數據行上加上共享鎖。可能導致大量的超時現象和鎖競爭。

äºå¡

什麼是髒讀、幻讀和不可重複讀?

  • 髒讀:髒讀是指一個事務讀取到其他事務沒有提交的數據。如果未提交的數據所在的事務執行了回滾,那麼就會出現數據錯誤。
  • 幻讀:幻讀是指一個事務內多次根據同一條件查詢出來的記錄行數不一致。
  • 不可重複讀:不可重複讀是指一個事務內多次根據同一查詢條件查詢出來的同一行記錄的值不一致。

參考:https://blog.csdn.net/lonely_bin/article/details/96175384

@Transactional註解 https://baijiahao.baidu.com/s?id=1661565712893820457&wfr=spider&for=pc

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