數據庫並發性問題
數據庫並發性問題指的是多個事務可以同時訪問數據庫中的數據,當多個事務在數據庫中並發執行時,數據的一致性可能收到破壞,從而導致數據出現問題。
事務就是用戶定義的一系列數據庫操作,這些操作可以視為一個完成的邏輯處理工作單元,要么全部執行,要么全部不執行,是不可分割的工作單元。
事務的四大屬性(ACID)
-
原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
-
一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。
-
隔離性(Isolation)
隔離性是當多個用戶並發訪問數據庫時,數據庫為每一個用戶開啟事務,不能被其他事物的操作所干擾,多個並發事務之間要相互隔離
-
持久性(Durability)
持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的情況下也不會丟失事務的操作。
悲觀鎖
悲觀鎖就是某個事務在更新數據過程中將數據鎖定,其他任何事務都不能讀取或修改,必須修改完成后才能訪問數據(類似於Java的線程同步鎖機制)。悲觀鎖的特點是具有排他性,通常依賴於數據庫的鎖機制,一般適合短事務處理。
select * from table_name where id=1 for update
樂觀鎖
樂觀鎖並不是一種數據庫鎖機制,而是一種沖突檢測機制(版本沖突檢測機制的時間沖突檢測機制),它的特點就是並發性較好,事務修改數據時,其他事務仍可以修改數據。
版本沖突檢測機制原理
即每個數據表中有一個版本字段 version,某一個事務更新數據后版本號+1,另一個事務更新后再+1,當事務發現數據庫當前版本號與讀取數據時版本號不一致時,說明在讀取數據后該數據已被其他事務修改,則不能更新數據。
樂觀鎖相對悲觀鎖而言,樂觀鎖假設認為數據一般情況下不會造成沖突,所以只會在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則返回用戶錯誤的信息,讓用戶決定如何去做。樂觀鎖的特點是並發性較好,事務修改數據時,其他事務仍可以修改數據。