我在我的大型Web应用程序中收到了很多死锁.
如何自动重新运行死锁事务?(ASP.NET MVC/SQL Server)
在这里,我想重新运行死锁事务,但我被告知摆脱死锁 - 它比试图赶上死锁要好得多.
所以我花了整整一天的时间用SQL Profiler,设置跟踪键等等.这就是我得到的.
有一张Users桌子.我有一个非常高的可用页面与以下查询(它不是唯一的查询,但它是导致麻烦的那个)
UPDATE Users
SET views = views + 1
WHERE ID IN (SELECT AuthorID FROM Articles WHERE ArticleID = @ArticleID)
Run Code Online (Sandbox Code Playgroud)
然后在所有页面中都有以下查询:
User = DB.Users.SingleOrDefault(u => u.Password == password && u.Name == username);
Run Code Online (Sandbox Code Playgroud)
这就是我从cookie中获取用户的地方.
通常会发生死锁,并且第二个Linq-to-SQL查询被选为受害者,因此它不会运行,并且我的站点用户会看到错误屏幕.
这是来自SQL事件探查器捕获的.XDL图形的信息(它只是第一个死锁,它不是唯一的.整个列表都是巨大的.):
<deadlock-list>
<deadlock victim="process824df048">
<process-list>
<process id="process824df048" taskpriority="0" logused="0" waitresource="PAGE: 7:1:13921" waittime="1830" ownerId="91418" transactionname="SELECT" lasttranstarted="2010-05-31T12:17:37.663" XDES="0x868175e0" lockMode="S" schedulerid="2" kpid="5076" status="suspended" spid="72" sbid="0" ecid="2" priority="0" trancount="0" lastbatchstarted="2010-05-31T12:17:37.663" lastbatchcompleted="2010-05-31T12:17:37.663" clientapp=".Net SqlClient Data Provider" hostname="WIN-S41KV2CLS67" hostpid="6920" …Run Code Online (Sandbox Code Playgroud)