kar*_*kar 4 c# sql sql-server stored-procedures database-deadlocks
我正在处理数据输入面板,一次有 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
Tbc_No=@Tbc_No,
Name=@Name,
EmailId=@EmailId,
MobileNo=@MobileNo,
Gender=@Gender,
LicenseNo=@LicenseNo,
GirNo=@GirNo,
PanNo=@PanNo,
H_Address=@H_Address,
H_City=@H_City,
H_PinNo=@H_PinNo,
H_county=@H_county,
H_State=@H_State,
O_Address=@O_Address,
O_City=@O_City,
O_PinNo=@O_PinNo,
LAL=@LAL,
MRNNo=@MRNNo,
AF=@AF,
NRI=@NRI,
CP=@CP,
Status=@Status from Tbl_Client_Bpo_Data where Id=@Id and CId=@CId
END
Run Code Online (Sandbox Code Playgroud)
这个存储过程像这样得到死锁错误......
transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. rerun the transaction.
Run Code Online (Sandbox Code Playgroud)
我创建了一个备份模块来查找错误日志,该日志显示此存储过程陷入死锁,而更多客户端也尝试更新数据。

我还补充说 SET TRANSACTION ISOLATION LEVEL READ COMMITTED
但它对我不起作用..有人可以提供解决方案来解决这种情况..
或者如果有某种机制可以保持执行过程直到前一次执行完成
小智 6
简答
您可能缺少表上的索引。首先,您必须检查您的更新是否正在生成表扫描,如果是,则在 ID 和 CID 上创建一个索引以查看是否可以解决您的问题。
长答案
表上的更新语句可以引入表扫描。这意味着,SQL Server 读取表中的每一行以检查行是否需要更新。在该读取操作期间,SQL Server 会对该行发出 (U) 更新锁。如果需要更新行,它将 (U) 锁转换为 (X) 排他锁并保持该锁直到事务结束。(U) 锁与其他 (U) 或 (X) 锁不兼容。
在您的情况下,您有 2 个会话在等待对方。每个会话将 X 锁放在(不同的)行上,并尝试发出 (U) 锁并读取由其他会话更新的行(持有(X)锁)。实际上它有点复杂 - 您涉及的会话超过 2 个,但我希望您有所了解。
创建索引以避免更新期间的表扫描
| 归档时间: |
|
| 查看次数: |
2017 次 |
| 最近记录: |