sql server中避免死鎖的方法
一、死鎖的四個必要條件
1、互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
2、請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
3、非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
4、循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每個進程都在等待相鄰進程正佔用的資源。
二、 避免死鎖
1、按同一順序訪問對象
如果所有併發事務按同一順序訪問對象,則發生死鎖的可能性會降低。例如,如果兩個併發事務獲得 Supplier 表上的鎖,然後獲得 Part 表上的鎖,則在其中一個事務完成之前,另一個事務被阻塞在 Supplier 表上。第一個事務提交或回滾後,第二個事務繼續進行。不發生死鎖。將存儲過程用於所有的數據修改可以標準化訪問對象的順序。
2、避免事務中的用户交互
避免編寫包含用户交互的事務,因為運行沒有用户交互的批處理的速度要遠遠快於用户手動響應查詢的速度,例如答覆應用程序請求參數的提示。例如,如果事務正在等待用户輸入,而用户去吃午餐了或者甚至回家過週末了,則用户將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。
3、保持事務簡短並在一個批處理中
在同一數據庫中併發執行多個需要長時間運行的事務時通常發生死鎖。事務運行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。
保持事務在一個批處理中,可以最小化事務的.網絡通信往返量,減少完成事務可能的延遲並釋放鎖。
4、使用低隔離級別
確定事務是否能在更低的隔離級別上運行。執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據,而不必等待第一個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。
5、使用綁定連接
使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會相互阻塞
6、SELECT語句加With(NoLock)提示
默認情況下SELECT語句會對查詢到的資源加S鎖(共享鎖),S鎖與X鎖(排他鎖)不兼容;但加上With(NoLock)後,SELECT不對查詢到的資源加鎖(或者加Sch-S鎖,Sch-S鎖可以與任何鎖兼容);從而可以是這兩條SQL可以併發地訪問同一資源。當然,此方法適合解決讀與寫併發死鎖的情況,但加With(NoLock)可能會導致髒讀。
-
如何獲取PHP數組的鍵與值呢
array_keys($array);//獲取數組(字典)的所有鍵值,返回一個鍵值數組。array_values($array)://獲取數組的所有value值,飯回一個數組。<?php$json='{"a":1,"b":2,"c":3,"d":4,"e":5}';//註明:value不帶雙引號時,其值只能是數字。【!!!注意:大括號兩邊只能是單引號,...
-
javascript閉包的定義及應用實例分析
官方解釋“閉包”是一個擁有許多變量和綁定了這些變量的環境表達式(通常是一個函數),因而這些變量也是環境表達式的一部分。通俗解釋Javascript中所有的函數都是一個閉包。不過一般來説,嵌套的function產生的閉包更為強大,也是大部分時候我們所説的“閉包”。看如下...
-
萬惡的function在javascript中的運用實例分析
javascript中最有特色而又讓你困惑的function算一個了下面看一下常用操作複製代碼代碼如下:functiondoit(){.....}doit();javascript中的函數我們可以把它當作方法使用複製代碼代碼如下:varobj=newObject();=function(){.....}();而function實際上就是對象(即F...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...