資料庫讀寫併發控制

2022-03-29 14:14:51 字數 1772 閱讀 5452

在資料庫中,併發控制是指在多個使用者/程序/執行緒同時對資料庫進行操作時,如何保證事務的一致性和隔離性的,同時最大程度地併發。

當多個使用者/程序/執行緒同時對資料庫進行操作時,會出現3種衝突情形:

讀-讀,不存在任何問題

讀-寫,有隔離性問題,可能遇到髒讀(會讀到未提交的資料) ,幻讀(重複讀)等。

寫-寫,可能丟失更新

要解決衝突,一種辦法是是鎖,即基於鎖的併發控制,比如2pl,這種方式開銷比較高,而且無法避免死鎖。

多版本併發控制(mvcc)是一種用來解決讀-寫衝突的無鎖併發控制,也就是為事務分配單向增長的時間戳,為每個修改儲存乙個版本,版本與事務時間戳關聯,讀操作唯讀該事務開始前的資料庫的快照。 這樣在讀操作不用阻塞寫操作,寫操作不用阻塞讀操作的同時,避免了髒讀和不可重複讀

樂觀併發控制(occ)是一種用來解決寫-寫衝突的無鎖併發控制,認為事務間爭用沒有那麼多,所以先進行修改,在提交事務前,檢查一下事務開始後,有沒有新提交改變,如果沒有就提交,如果有就放棄並重試。樂觀併發控制類似自選鎖。樂觀併發控制適用於低資料爭用,寫衝突比較少的環境。

悲觀鎖,正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。

總結:  

悲觀鎖(pessimistic lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

樂觀鎖(optimistic lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫如果提供類似於write_condition機制的其實都是提供的樂觀鎖。

兩種鎖各有優缺點,不可認為一種好於另一種,像樂觀鎖適用於寫比較少的情況下,即衝突真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產生衝突,上層應用會不斷的進行retry,這樣反倒是降低了效能,所以這種情況下用悲觀鎖就比較合適。

事務沒有隔離性會出現的問題:

髒讀:(同時操作都沒提交的讀取)

髒讀又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。

例如:事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因rollback了,那麼事務t2讀取的資料就是髒的。

解決辦法:把資料庫的事務隔離級別調整到read_committed

不可重複讀:(同時操作,事務一分別讀取事務二操作時和提交後的資料,讀取的記錄內容不一致)

不可重複讀是指在同乙個事務內,兩個相同的查詢返回了不同的結果。

例如:事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。 解決辦法:把資料庫的事務隔離級別調整到repeatable_read

幻讀:(和可重複讀類似,但是事務二的資料操作僅僅是插入和刪除,不是修改資料,讀取的記錄數量前後不一致)

例如:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入(注意時插入或者刪除,不是修改))了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。

解決辦法:把資料庫的事務隔離級別調整到serializable_read

資料庫併發控制

資料庫併發控制 1 在資料庫中為什麼要併發控制?答 資料庫是共享資源,通常有許多個事務同時在執行。當多個事務併發地訪問資料庫時就會產生同時讀取和 或修改同一資料的情況。若對併發操作不加控制就可能會訪問和儲存不正確的資料,破壞資料庫的一致性。所以資料庫管理系統必須提供併發控制機制。2 併發操作可能會產...

資料庫併發控制

acid,是指在可靠資料庫管理系統 dbms 中,事務 transaction 所應該具有的四個特性 a 原子性 atomicity 事務是乙個或多個行為 在一起組成乙個單獨的工作單元,事務中的動作要不都發生,要不都不發生.c 一致性 consistent 即在事務開始之前和結束之後,資料庫的完整性...

資料庫併發控制

資料庫是乙個資源庫,可以供多個使用者使用.允許多個使用者同時使用同乙個資料庫的資料庫系統稱為多使用者資料庫系統.例如飛機訂票資料庫系統 銀行資料庫系統.在多使用者資料庫系統中同乙個時刻會有很多個併發執行的事務.1.提高吞吐量和資源利用率 乙個事務由多個步驟組成,一些步驟涉及i o活動,另一些涉及cp...