導航:首頁 > 數據處理 > 資料庫出現臟讀怎麼解決

資料庫出現臟讀怎麼解決

發布時間:2023-11-13 17:17:15

A. 簡述臟數據的產生原因及解決辦法

資料庫鎖的產生原因及解決辦法
資料庫和操作系統一樣,是一個多用戶使用的共享資源。當多個用戶並發地存取數據 時,在資料庫中悔歷就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。加鎖是實現資料庫並 發控制的一個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有沖突的鎖,而不能將事務繼續下去的話,就會出現死鎖,嚴 重影響應用的正常執行。
在資料庫中有兩種基本的鎖類型:排它鎖碧晌搜(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩 種基本的鎖類型來對資料庫的事務進行並發控制。
死鎖的第一種情況
一個用戶A 訪問表A(鎖住了表A),然後又訪問表B;另一個用戶B 訪問表B(鎖住了表B),然後企圖訪問表A;這時用戶A由於用戶B已經鎖住表B,它必須等待用戶B釋放表B才能繼續,同樣用戶B要等用戶A釋放表A才能繼續,這就死鎖就產生了。
解決方法:
這種死鎖比較常見,是由於程序的BUG產生的,除了調整的程序的邏輯沒有其它的辦法。仔細分析程序的邏輯,對於資料庫的多表操作時,盡量按照相同的順序進 行處理,盡量避免同時鎖定兩個資源,如操作A和B兩張表時,總是按先A後B的順序處理, 必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源。
死鎖的第二種情況
用戶A查詢一條紀錄,然後修改該條紀錄;這時用戶B修改該條紀錄,這時用戶A的事務里鎖的性質由查詢的共享鎖企圖上升到獨占鎖,而用戶B里的獨占鎖由於A 有共享鎖存在所以必須等A釋放掉共享鎖,而A由於B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,於是出現了死鎖。這種死鎖比較隱蔽,但在稍大點的項 目中經常發生。如在某項目中,頁面上的按鈕點擊後,沒有使按鈕立刻失效,使得用戶會多次快速點擊同一按鈕,這樣同一段代碼對資料庫同一條記錄進行多次操 作,很容易就出現這種死鎖的情況。
解決方法:
1、對於按鈕等控制項,點擊後使其立刻失效,不讓用戶重復點擊,避免對同時對同一條記錄操作。
2、使用樂觀鎖進行控制。樂觀鎖大多是基於數據版本(Version)記錄機制實現。即為數據增加一個版本標識,在基於資料庫表的版本解決方案中,一般是 通過為資料庫表增加一個「version」欄位來實現。讀取出數據時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交數據的版本數據與數 據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大於資料庫表當前版本號,則予以更新,否則認為是過期數據。樂觀鎖機制避免了長事務中的數據 庫加鎖開銷(用戶A和用戶B操作過程中,都沒有對資料庫數據加鎖),大大提升了大並發量下的系統整體性能表現。Hibernate 在其數據訪問引擎中內置了樂觀鎖實現。需要注意的是,由於樂觀鎖機制是在我們的系統中實現,來自外部系統的用戶更新操作不受我們系統的控制,因此可能會造 成臟數據被更新到資料庫中。
3、使用悲觀鎖進行控制。悲觀鎖大多數情況下依靠資料庫的鎖機制實現,如Oracle的Select … for update語句,以保證操作最大程度的獨占性。但隨之而來的就是資料庫性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。如一個金融系統, 當某個操作員讀取用戶的數據,並在讀出的用戶數據的基礎上進行修改時(如更改用戶賬戶余額),如果採用悲觀鎖機制,也就意味著整個操作過程中(從操作員讀 出數據、開始修改直至提交修改結果的全過程,甚至還包括操作員中途去煮咖啡的時間),資料庫記錄始終處於加鎖狀態,可以想見,如果面對成百上千個並發,這 樣的情況將導致災難性的後果。所以,採用悲觀鎖進行控制時一定要考慮清楚。
死鎖的第三種情況
如果在事務中執行了一條不滿足條件的update語句,則執行全表掃描,把行級鎖上升為表級鎖,多個這樣的事務執行後,就很容易產生死鎖和阻塞。類似的情 況還有當表中的數據量非常龐大而索引建的過少或不合適的時候,使得經常發生全表掃描,最終應用系統會越來越慢,最終發生阻塞或死鎖。
解決方法:
SQL語句中不要使用太復雜的關謹核聯多表的查詢;使用「執行計劃」對SQL語句進行分析,對於有全表掃描的SQL語句,建立相應的索引進行優化。
5.小結
總體上來說,產生內存溢出與鎖表都是由於代碼寫的不好造成的,因此提高代碼的質量是最根本的解決辦法。有的人認為先把功能實現,有BUG時再在測試階段進 行修正,這種想法是錯誤的。正如一件產品的質量是在生產製造的過程中決定的,而不是質量檢測時決定的,軟體的質量在設計與編碼階段就已經決定了,測試只是 對軟體質量的一個驗證,因為測試不可能找出軟體中所有的BUG。

B. 資料庫的數據臟讀是什麼意思,怎樣有效的避免數組臟讀,博客

臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。因為這個數據是還沒有提交的數據,那麼另外一個事務讀到的這個數據是臟數據,依據臟數據所做的操作可能是不正確的。

1、如果都未更新你就讀取了,或者都更新完才讀取,這都不是臟讀,因為得到的是更新前的有效值,或完全更新後的值。

2、如果那個用戶更新一半你就讀取了,也就是說更新了A,正打算要更新B但尚未更新時,就讀取了,此時得到的就是臟數據。

避免臟讀的辦法就是採取事務,使得用戶正在更新時鎖定資料庫,阻止你讀取,直至全部完成才讓讀取。

(2)資料庫出現臟讀怎麼解決擴展閱讀:

在資料庫技術中,臟數據在臨時更新(臟讀)中產生。事務A更新了某個數據項X,但是由於某種原因,事務A出現了問題,於是要把A回滾。但是在回滾之前,另一個事務B讀取了數據項X的值(A更新後),A回滾了事務,數據項恢復了原值。事務B讀取的就是數據項X的就是一個「臨時」的值,就是臟數據。

閱讀全文

與資料庫出現臟讀怎麼解決相關的資料

熱點內容
襄陽職業技術學院附近有什麼 瀏覽:881
nba有哪些令人驚艷的數據 瀏覽:665
纖伏代理怎麼樣 瀏覽:373
如何查看自己定向傭金產品 瀏覽:122
簡歷配偶信息怎麼寫 瀏覽:564
商貿代理怎麼做 瀏覽:63
hmi模具加工有哪些技術 瀏覽:55
完美蘆薈膠怎麼代理 瀏覽:439
合約交易避開8點能省多少手續費 瀏覽:448
人類目前缺什麼技術 瀏覽:431
警察與程序員哪個好 瀏覽:708
夢見臨時市場在哪裡 瀏覽:420
交易所流水是什麼 瀏覽:153
小程序代理怎麼找客 瀏覽:915
學電子技術專業的筆記本要什麼配置 瀏覽:809
特效生發產品有哪些 瀏覽:725
國產哪些技術不如國外 瀏覽:851
朝鮮生產什麼農產品 瀏覽:193
掛什麼號可以查到違章信息 瀏覽:435
釘釘拉人進群能看到多少條信息 瀏覽:199