資料庫事務的ACID四大原則 學習筆記

2021-10-25 07:30:59 字數 2588 閱讀 7143

說起資料庫,可以不知道sql,但一定不能不知道acid。

資料庫事務acid四大原則:

原子性簡單,也最常用。即在事務中所有操作都被視為乙個不可分割的整體,要麼全成功,要麼全失敗。

原子性經典的例子是a給b轉賬,不能a扣了錢,但b卻沒收到(因為網路等原因)。

事務的一種實現方法是在執行的時候,先不將最終的結果更新到資料庫,而是先寫在事務日誌上,等整個事務執行成功後,再將事務日誌上的內容同步到資料庫中。如果失敗了,事務日誌刪除,完成回滾。

永續性是指,在事務完成了之後,這個事務對資料庫所做的修改就被持久地儲存進了資料庫中,不會再被回滾操作影響。即使出現機房斷電等意外情況,資料庫中的資料也不會丟失。

那麼,怎樣做到資料庫中的資料不丟呢?假設資料庫中的資料丟了,那麼只要根據事務日誌重新執行一遍對應的操作,就可以恢復資料庫當中的資料,維持資料庫的永續性。實際上,現在的資料庫缺省會將所有的操作都當做事務來執行,因此基本不用擔心資料丟失的情況。

在多個事務一起執行的時候,如果隔離性做的不好,那麼可能會導致很多問題。

以下四種問題最常見:

髒讀指乙個事務讀到了另乙個事務的中間結果,還用轉賬舉例:

當a給b轉賬的事務沒有執行完,另乙個事務就讀取了它的中間結果,就有可能造成髒讀。因為萬一之前的事務回滾,那麼新讀取到的結果就是錯的,和a賬號回滾之後的餘額就不一致了。

不可重複讀的意思是說,在乙個事務中,我們讀取了某個資料兩次。剛好在這兩次中間,有另乙個事務修改了這條資料,那麼同樣會引起資料錯誤,因為這兩次讀取到的結果不一致。

比如我們對a賬戶的乙個事務還沒有結束,這時它的結果就被另乙個事務修改了,那麼程式就會發生錯亂,因為讀到了它沒有預料到的修改。

解決方法就是針對當前修改的資料進行隔離,同一時刻只允許乙個事務對該條資料進行修改,以保證資料的一致性。

幻讀就是乙個事務讀取兩次,讀到的資料條數不一致。這點和不可重複讀非常類似,不過不同的是不可重複讀是確定的某一條資料,而幻讀是指整個資料庫或者整個表而言。

要解決也很簡單,因為幻讀是其他事務修改其他資料產生的,所以要排除掉這種情況,只針對我們修改的資料進行加鎖和隔離是不夠的,我們需要將整個資料庫,或者是分割槽進行隔離,同一時刻,只允許乙個事務對乙個分片或資料庫表進行修改。

更新丟失的定義很直觀,當我們修改一條資料的時候,另乙個事務也在修改這條資料,導致後者的修改覆蓋了前者修改的內容。

解決的辦法是做好隔離操作,在乙個事務寫入完成之前,禁止其他事務寫入。即更新丟失是在併發場景下出現的錯誤。

解決辦法就是設定不同的隔離級別,不同的隔離級別對應不同的隔離策略,可以保證不同級別下的隔離性。

不同的隔離級別,意味著使用不同級別的鎖,顯然隔離級別越高,效能越差。這就需要dba根據業務場景,在效能和隔離安全性之間做乙個權衡:

從上到下,對應四種隔離級別,越往下隔離級別越高,能夠解決的隔離性問題也就越多,同樣的,用到的鎖也就越多,系統的效能也就越差。

現在分別看下資料庫的四種隔離級別:

1)未提交讀:在讀時不會判斷是否可能會讀到沒有提交的資料,所以他的隔離性最差,連最簡單的髒讀都無法解決。

2)已提交讀:通過鎖限制了只會讀取已經提交的資料,讀資料的時候使用共享鎖,在讀取完成後立即釋放。已提交讀級別可解決髒讀問題,也是sql server的預設隔離級別。

3)可重複讀:讀取過程和已提交讀級別一樣,但在讀取時會保持共享鎖,直到事務結束。跟已提交讀不同的是,只要乙個事務沒有結束,鎖就不會釋放,其他事務無法更新資料,保證了不會出現不可重複讀。

4)可序列讀:在事務進行中,不僅會鎖定受影響的資料本身,還會鎖定整個範圍。這就組織了其他事務影響整體的情況出現。

資料庫的一致性表示資料的狀態是正確的,即和程式設計師預期的狀態一致。

雖然一致性是資料庫的四大原則之一,但資料庫系統當中並沒有專門針對一致性的部分,只要滿足了其他三原則,那麼自然就達成了一致性。

舉例說明,a向b轉帳100,前提條件是a的賬號中錢大於等於100,如小於100,如果在開發程式時沒有校驗,還強行轉賬成功,那麼這個結果就跟我們預期不一致,就是這個問題並不是因為書刊沒有做到一致性,而是開發人員忽略了限制條件。

所以,教材上寫「ensuring the consistency is the responsibility of user, not dbms.", "dbms assumes that consistency holds for each transaction」。

保證一致性是開發的責任,不是資料庫的責任,資料庫假設每乙個事務都符合一致性。

資料庫事務四大特性(ACID)

1 原子性 atomicity 原子性是指乙個事物內所有操作共同組成乙個原子包,要麼全部成功,要麼全部失敗回滾。也就是說事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。2 一致性 consistency 資料庫事物的一致性就規定了事物提交前後,永遠只可能存在事物提交...

資料庫事務的四大特性 ACID

原子性 atomicity 事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。一致性 consistemcy 事務前後,資料庫的狀態都滿足所有的完整性約束。隔離性 isolation 併發執行的事務是隔離的,乙個不影響乙個。如果有兩個事務,執行在相同的時間內,執行相同的功能,...

資料庫事務的四大特性 ACID

原子性 atomicity 事務是資料庫的邏輯工作單位,它對資料庫的修改要麼全部執行,要麼全部不執行。一致性 consistemcy 事務前後,資料庫的狀態都滿足所有的完整性約束。隔離性 isolation 併發執行的事務是隔離的,乙個不影響乙個。如果有兩個事務,執行在相同的時間內,執行相同的功能,...