2015-11-03 74 views
4

我正在一個數據輸入面板上,有超過300個客戶端一次更新數據表上的數據,我使用存儲過程執行數據表中的更新,看起來像這樣..更新存儲過程中的死鎖

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:    <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description:  <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[Update_Tbl_Client_Bpo_Data] 

@Id int, 
@CId varchar(50), 
@Tbc_No varchar(200), 
@Name varchar(200), 
@EmailId varchar(200), 
@MobileNo varchar(50), 
@Gender varchar(50), 
@LicenseNo varchar(200), 
@GirNo varchar(200), 
@PanNo varchar(200), 
@H_Address varchar(500), 
@H_City varchar(200), 
@H_PinNo varchar(200), 
@H_county varchar(200), 
@H_State varchar(200), 
@O_Address varchar(200), 
@O_City varchar(200), 
@O_PinNo varchar(200), 
@LAL varchar(200), 
@MRNNo varchar(200), 
@AF varchar(200), 
@NRI varchar(200), 
@CP varchar(200), 
@Status varchar(200) 

AS 
BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 



     update Tbl_Client_Bpo_Data 
set 

[email protected]_No, 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected]_Address, 
[email protected]_City, 
[email protected]_PinNo, 
[email protected]_county, 
[email protected]_State, 
[email protected]_Address, 
[email protected]_City, 
[email protected]_PinNo, 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected], 
[email protected] from Tbl_Client_Bpo_Data where [email protected] and [email protected] 
END 

此存儲過程得到死鎖錯誤是這樣的...

transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. rerun the transaction. 

我創建一個備份模塊發現錯誤日誌,顯示這個存儲過程得到的僵局,而更多的客戶也嘗試更新數據。 。 Error Logs

我還添加了SET TRANSACTION ISOLATION LEVEL READ COMMITTED

,但它不爲我工作.. 有人可以給出一個解決方案來解決這個問題..

或有某種機制保持執行過程,直到先前執行完成

+1

[事務(進程ID)的可能的複製被死鎖的鎖資源與另一個進程,並已被選作死鎖犧牲品。重新運行事務](http://stackoverflow.com/questions/9212255/transaction-process-id-was-deadlocked-on-lock-resources-with-another-process-a) – MusicLovingIndianGirl

+0

@AishvaryaKarthik我還補充了'ISOLATION LEVEL '..我還在我的問題中提到了這個問題 –

+0

你的桌子上是否有索引會更新? – MikeAinOz

回答

4

簡短的回答

您可能忽略你的表的索引。首先,您必須檢查您的更新是否正在生成表掃描,如果是,請在ID和CID上創建一個索引以查看是否可以解決您的問題。

龍答案

你的桌子上更新語句可以引入表掃描。這意味着,SQL Server讀取表中的每一行以檢查是否需要更新行。在讀取操作期間,SQL Server發出(U)更新行的鎖定。如果行需要更新,它將(U)鎖轉換爲(X)獨佔鎖,並保持該鎖直到事務結束。 (U)鎖與其他(U)和(X)鎖不兼容。

在你的情況下,你有2個會話彼此等待。每個會話都將X鎖放在(不同的)行上,並嘗試發出(U)鎖並讀取由其他會話更新的行(以(X)鎖持有)。這實際上有點複雜 - 你有超過2個會議參與,但我希望你有一個想法。

創建索引更新過程中,以避免表掃描

+0

非常感謝您的幫助。它的工作原理,但有些時候會出現這個錯誤,我還添加了索引到我的表現在它像魅力工作..感謝您的幫助先生 –

+0

我很高興它的工作! –

+0

對問題的很好的分析和一個非常好的答案 – MikeAinOz