我有2個批處理程序,1是發送電子郵件和另一個發送傳真的程序。他們都訪問名爲QUEUE
的表。在SQL Server中鎖定
在電子郵件發件人程序中,這與QUEUE
有關。在QUEUE
滿足標準的每個記錄:
- 鎖記錄1中
QUEUE
表:
select 1 from QUEUE with (UPDLOCK) where id = 1
- 過程發送出電子郵件的
- 刪除記錄1 QUEUE表:
delete from QUEUE where id = 1
- 犯交易(交易不是自動提交)
在傳真發件人程序中,除了在步驟2中發送傳真(當然)之外,也會發生類似的步驟。
問題是,有時從QUEUE
刪除了一個異常,它被鎖定。從而重新發送電子郵件/傳真。我確信這些程序處理的記錄組不會相交。
似乎刪除嘗試獲取表中其他記錄上的更新(U)鎖,儘管只有一條記錄要刪除。因此,當其他事務鎖定在同一個表中的其他記錄時發生異常。
因此,我需要知道是否有一個選項可以使「刪除」操作不會獲取記錄以外的鎖,而是刪除它將刪除的記錄。因爲看起來問題在於「刪除」操作鎖定了表中的其他記錄。
順便說一句,這裏是有關數據庫的一些信息(我不知道他們是否會幫助):
- 提交讀快照被打開
- 快照隔離狀態是
利用的建議,正是我所擔心的是,如果我遭遇期間,我刪除時間鎖定錯誤的問題你。即使我刪除了鎖,我仍然很容易在刪除期間遇到鎖定錯誤(它鎖定了其他記錄)。我在想的是在make部分嘗試刪除直到成功。 – rizza 2009-03-06 12:00:46
是的,你可以做到這一點。但是,如果沒有交易,您不太可能會遇到鎖定問題。在運行下一個之前,數據庫通常會等待一個更新/刪除完成。大多數情況下,當您在事務處理過程中遇到冗長的進程或死鎖情況時,這是一個問題。 – Guffa 2009-03-06 12:39:59