我们目前遇到的 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
* 线程 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
执行第 7 步后,您将收到死锁。
> Transaction (Process ID 124) was deadlocked on lock resources with
> another process and has been chosen as the deadlock victim. Rerun the
> transaction.
我们目前正在调查 SQL Server 中的死锁是如何工作的,以及我们如何从我们这边防止死锁,但欢迎任何有关此操作/检查的输入/建议。
如果需要额外的信息,我可以添加它,只要它不违反我们的工作规则。
如何解决死锁完全取决于您的数据需求。
您是否满足于仅对数据应用最后一次更新?
在这种情况下,根本不要使用事务——这会自动发生。
是否每个用户都必须看到仅针对该用户应用的真实更新?
这是您当前正在尝试的,包括(呃)在等待网页时保持事务打开,等等。
我将从调查做这件非常糟糕的事情的实际需要开始......
不管最终目标是什么,显式事务都应该少用、明智且有充分的理由使用。