SQL Server 中的死锁

cod*_*nny 5 sql-server deadlock c#

我们目前遇到了 ASP.NET 应用程序的问题,导致 SQL Server 数据库出现死锁。我可以提供的一些背景信息是我们严重依赖 AJAX 回调。

该问题发生在具有各种“字段”的页面上,这些“字段”包含有关资源的信息。用户可以单击每个字段将其转换为允许更改数据的“编辑模式”。基本上这样做是打开一个事务,保存项目,更新 html 并关闭事务。

用户可以更改数据,然后通过事务再次保存更改。我们还有一些按钮,可以按下这些按钮来触发运行新事务的脚本(C# 动态代码)。

下面是在这种情况下运行的两个线程及其正在做什么的小记录。

* 主题 1 *

Step 1. SET TRANSACTION ISOLATION LEVEL read committed 
Step 2. begin transaction 
Step 3. update Person set Name = 'Person1' where itemId  = 801 
Step 7. update Person set Name = 'Person3' where itemId  = 801 
Step x. commit transaction
Run Code Online (Sandbox Code Playgroud)

* 线程 2 *

Step 4. SET TRANSACTION ISOLATION LEVEL read committed 
Step 5. begin transaction 
Step 6. update Person set Name = 'Person2' where itemId  = 801 
Step x. commit transaction
Run Code Online (Sandbox Code Playgroud)

执行第 7 步后,您将收到一个死锁。

> Transaction (Process ID 124) 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)

我们目前正在调查死锁在 SQL Server 中是如何工作的,以及我们如何从我们这边防止死锁,但欢迎任何关于此执行/检查的输入/建议。

如果需要其他信息,只要不违反我们的工作规则,我就可以添加它。

小智 1

如何解决死锁完全取决于你的数据需求。

您是否满足于仅对数据应用最后一次更新?
在这种情况下,根本不要使用事务 - 这会自动发生。

是否每个用户都必须看到仅应用于该用户的真实更新?这就是您当前正在尝试的操作,包括(呃)在等待网页
时保持事务打开,等等。

我将从调查做这件非常糟糕的事情的实际需要开始......

无论最终目标如何,显式事务的使用都应该稀疏、明智且有充分的理由。