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
如何解决死锁完全取决于你的数据需求。
您是否满足于仅对数据应用最后一次更新?
在这种情况下,根本不要使用事务 - 这会自动发生。
是否每个用户都必须看到仅应用于该用户的真实更新?这就是您当前正在尝试的操作,包括(呃)在等待网页
时保持事务打开,等等。
我将从调查做这件非常糟糕的事情的实际需要开始......
无论最终目标如何,显式事务的使用都应该稀疏、明智且有充分的理由。