理解資料庫之事務與其隔離級別

2021-09-24 14:29:31 字數 1275 閱讀 2116

一、事務的四大特性

原子性原子性是指事務包含的操作要麼全部成功,要麼全部失敗回滾。

一致性一致性是指事務必須使資料庫從乙個一致性狀態變換為另乙個一致性狀態,也就是說事務執行之前和執行之後都必須處於一致性狀態。以a、b兩個使用者轉賬為例,無論如何轉賬,兩個使用者的總金額和是不變的。

隔離性隔離性是指當多個使用者訪問資料庫時,比如操作同一張表時,資料庫為每乙個使用者開啟的事務,不能被其他事務所干擾,多個併發事務之間的操作是相互隔離的。

永續性永續性是指乙個事務一旦被提交成功,那麼對資料庫中的資料修改是永久性的。即使在遇到故障的情況下也不會丟失提交事務的操作。

二、併發事務帶來的四個問題

讀未提交

指資料庫訪問中,有兩個事務讀入同一資料並修改,後修改事務提交的結果覆蓋了前事務提交的結果,導致前事務的修改被丟失。

髒讀指資料庫訪問中,乙個事務a對資料進行了修改,並將其寫入磁碟但並未提交,另乙個事務b讀取了該資料,此時事務a傳送了異常,而回滾了事務。這是事務b讀取到的資料即是個「髒」資料,即產生了髒讀。

不可重複讀

指資料庫訪問中,同乙個事務對乙個資料進行多次讀取,在該事務的兩次讀資料之間,另乙個事務對該資料進行了修改,導致該事務兩次讀取的資料不一致,因此稱為不可重複讀。即在乙個事務範圍內兩次相同的查詢讀取的資料是不一樣的,我們就稱為是不可重複讀。

幻讀指資料庫訪問中,事務a對某條件下的記錄數進行查詢時,有另乙個事務b對該條件下的記錄新增了一條,事務a再次查詢該記錄數時,讀取的記錄變化了,此時產生了幻讀。

tip:

這裡需區分開不可重複讀與幻讀。前者是指事務對同一資料的再次訪問時,讀取到的值不一樣了;而後者是指同樣的條件,第1次和第2次讀出來的記錄數不一樣了。

三、資料庫事務隔離級別的介紹

資料庫事務提供了4種隔離級別,以下4個隔離級別逐個解決了髒讀、不可重複讀和幻讀這幾個問題。

讀未提交資料

允許事務讀取未被其他事務提交的變更,可能有髒讀、不可重複讀、幻讀的問題。

讀已提交資料

允許事務讀取已經被其他事務提交的變更,可以避免髒讀,可能有不可重複讀、幻讀的問題。

可重複讀(mysql的預設隔離級別)

確保事務可以多次從乙個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個字段進行更新,可以避免髒讀與不可重複讀,可能會有幻讀。

可序列化

所有事務都乙個接乙個地序列執行,可以避免髒讀、不可重複讀、幻讀的問題。

transaction那些事兒:

如何理解資料庫事務隔離級別

總的說,資料庫事物無非就兩種 讀取事物 select 修改事物 update,insert 在沒有事物隔離控制的時候,多個事物在同一時刻對同一 資料的操作可能就會影響到最終期望的結果,通常有四種情況 1 兩個更新事物同時修改一條資料時,很顯然這種情況是最嚴重的了,程式中無論如何也不能出現這種情況,因...

資料庫之事務的隔離級別

iso 和 anis sql 標準制定了四種事務隔離級別,而 innodb 遵循了 sql 1992 標準中的四種隔離級別 read uncommited 使用查詢語句不會加鎖,可能會讀到未提交的行 dirty read read commited 只對記錄加記錄鎖,而不會再記錄之間加間隙鎖,所以允...

資料庫學習之事務隔離級別

主要內容 一致性讀 當前讀 在讀提交隔離級別之下 事務a k 2 事務b k 3 大白話 原理 在可重複讀隔離級別之下,查詢操作所遵循的是一致性試圖中給出的資料,更新操作所遵循的是當前讀中所給出的資料。mvcc 多版本併發控制。在我的理解裡面,就是回滾操作 transaction id 在innod...