資料庫事務隔離級別

2021-10-24 14:17:41 字數 1350 閱讀 1600

事務是一系列操作構成的乙個執行單元。這些操作可以是插入、刪除、更新或查詢,它們要麼全部執行,要麼全不執行。

原子性原子性其實就是把事務的定義又表述了一遍,強調同乙個事務中的操作只能全部成功或全部失敗,不能部分成功。全部失敗是要回到執行之前的狀態。

一致性比較正式的說法是事務執行(成功或回滾)後,資料庫的完整性約束沒有被破壞。

一方面是資料庫本身的約束,比如唯一鍵約束,外來鍵約束等,這些不需要我們操心,資料庫自身會保證。

另一方面是資料一致性。所謂此消彼長,能量既不會憑空產生,也不會憑空消失,它只會從一種形式轉化為其他形式,或者從乙個物體轉移到另乙個物體,而在轉化和轉移的過程中,能量的總量保持不變,這就是能量恆守定律。一致性也是如此。

隔離性隔離性指併發執行的事務之間不能互相干擾。隔離性並不是事務執行上的完全隔離,而是值事物間影響的隔離,如果兩個事務之間不會相互影響,也就不需要隔離了。原子性和隔離性都是為了保證一致性。

永續性這裡的永續性不是你們想象的永續性,它是指事務完成以後,它所帶來的影響將永久存在於資料庫中,不會被回滾,斷電重啟也還在。

一是因為事務不是單一操作,而是一些列操作;二是因為事務會併發執行。如果事務沒有隔離,那麼併發執行的結果將是不可預知的。

隔離級別一共4個,由低到高依次是讀未提交讀提交可重複讀序列。根據掐頭去尾原則,讀未提交和序列一般是不用的。我也不懂為什麼萬年不用的東西還要存在。

讀未提交

這是最低的隔離級別,它允許乙個事務讀取其他事務還未提交的內容。由於還未提交,所以就可能回滾,這樣導致的問題叫髒讀。

讀提交這是多數資料庫的預設隔離級別,它限制了乙個事務要等另乙個事務提交後才能讀取資料。如果乙個事務裡有兩個讀取操作,而這兩個讀取操作之間有乙個包含更新操作的事務提交,就會導致兩次讀取的內容不一致,這就叫不可重複讀。不可重複讀指的是在同乙個事務中重複讀取的內容不一致。

可重複讀

這是mysql的預設隔離級別,它規定讀資料的事情開啟後不允許修改操作。因為可重複讀只是不允許修改,但是可以插入。如果在兩次範圍讀取中,有另乙個事務插入了資料,那麼這兩次範圍讀取的內容也會不一致,這次取名叫幻讀。

序列這是最高的隔離級別,事務之間序列執行。它不會出現髒讀、不可重複讀和幻讀,但是一般也不用。一是因為效率低,二是事務之間有併發的可能性,並不是所有事務之間都必須隔離,雖然會有一些問題,但是實踐告訴我們,問題不大。

至此你會發現事務隔離中的問題都發生在兩次讀操作中。

兩次讀取之間,被讀的資料回滾,就是髒讀。

兩次讀取之間,被讀的資料更新,就是不可重複讀。

兩次讀取之間,插入新資料,就是幻讀。

隨著隔離級別的提高,就是在依次解決以上三個問題。

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...

資料庫事務隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...