<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    針對數據庫死鎖的預防措施有哪些


    發現錯別字 11個月前 提問
    回答
    1
    瀏覽
    2003
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    回答數量: 1
    風險管理(專業級)RM/PL CICSA

    針對數據庫死鎖的預防措施有以下這些:

    • 應盡可能縮短事務。在同一DB中并發執行多個需要長時間運行的事務時,發生死鎖的概率較大。事務運行時間越長,其持有排它鎖(exclusive鎖)或更新鎖(update鎖)的時間便越長,從而堵塞了其它活動并可能導致死鎖。保持事務在一個批處理中,可以最小化事務的網絡通信往返量,減少完成事務可能的延遲并釋放鎖。同時,涉及多個表的查詢更新操作,若比較耗時,盡量不要放在一個事務內處理,能分割便分割。若不能分割,便盡可能使之在業務量較小的時間(例如子夜或者午餐時間)執行。

    • 應按同一順序訪問數據對象。如果所有并發事務按同一順序訪問對象,則發生死鎖的可能性會降低。例如,如果兩個并發事務獲得Supplier表上的鎖,然后獲得Part表上的鎖,則在其中一個事務完成之前,另一個事務被阻塞在Supplier表上。第一個事務提交或回滾后,第二個事務繼續進行。不發生死鎖。將存儲過程用于所有的數據修改可以標準化訪問對象的順序。

    • 必須避免編寫包含用戶交互的事務。因為運行沒有用戶交互的批處理的速度要遠遠快于用戶手動響應查詢的速度,若用戶不能及時反饋,則此事務將掛起。因而將嚴重降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。

    • 可使用低隔離級別。確定事務是否能在更低的隔離級別上運行。執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據,而不必等待第一個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。

    • 可考慮體系結構的優化與代碼重構,提高系統整體的運行效率。例如盡可能不采用效率低下的計算模型,復雜的業務應采用異步任務調度處理。

    • 可通過程序控制事務提交的時機。如果一次檢索出了10萬條記錄但只更改了其中的100條,就可以通過代碼來執行100個update。或是用分段提交,即所有的修改使用多個事務進行提交,但這樣會使事務不完整,應酌情使用。

    • 宜將經常更新的數據庫和查詢數據庫分開。定期將不改變的數據導入查詢數據庫中,這樣查詢和更新就可以分開進行,而降低死鎖機率。

    • 在進行數據庫模式設計時,應注意外鍵引用的完整性,并對外鍵加索引。如果更新了父表的主鍵,由于外鍵上沒有索引,所以子表會被鎖定;如果刪除了父表中的一行,整個子表也會被鎖定。

    回答所涉及的環境:聯想天逸510S、Windows 10。

    11個月前 / 評論
    亚洲 欧美 自拍 唯美 另类