相关疑难解决方法(0)

设计中的零SQL死锁 - 任何编码模式?

我在MS SQL Server 2005之上运行的.NET 2.0 webapp上遇到非常罕见且烦人的SQL死锁.过去,我们一直在以经验的方式处理SQL死锁 - 基本上调整查询直到它工作.

然而,我发现这种方法非常不令人满意:耗时且不可靠.我更倾向于遵循确定性查询模式,这些模式将确保设计不会遇到任何SQL死锁.

例如,在C#多线程编程中,必须按照字典顺序执行一个简单的设计规则(如锁定),以确保不会发生死锁.

是否有任何SQL编码模式可以保证防死锁?

sql sql-server deadlock design-patterns

31
推荐指数
2
解决办法
7264
查看次数

我有关于死锁的数据,但我不明白它们为什么会发生

我在我的大型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)

sql-server asp.net-mvc database-deadlocks

6
推荐指数
1
解决办法
5737
查看次数