【发布时间】:2011-03-28 21:14:49
【问题描述】:
我目前正在对 SQL Server 2008 数据库进行一些实验。更具体地说,我有一个 JDBC 应用程序,它使用数百个并发线程来执行数千个任务,每个任务都在数据库上运行以下查询:
UPDATE from Table A where rowID='123'
但是,每当我将隔离级别设置为高于 READ_UNCOMMITTED 时,都会出现大量死锁错误(SQL 异常 1205)。即使我设置了行锁定、表锁定和独占锁定提示,它也会发生!即使在不使用锁的快照隔离中,我仍然会遇到死锁错误。
当这种情况发生时,我通过 SQL Profiler 运行跟踪以获取死锁图,但这并没有多大用处。它显示了受害者进程,连接到一个“线程池”,连接到数百个其他进程。你可以在这里查看:
http://i.stack.imgur.com/7rlv3.jpg
有人对为什么会发生这种情况有任何提示吗?在过去的几天里,我一直在发疯,试图弄清楚。我目前的假设是,它与我的数据库实例中可用的工作线程、可用内存量或与实际查询级锁无关的东西有关。
谢谢!
【问题讨论】:
-
Seen this already?你的更新声明有并行计划吗?
-
您是说当
READ_UNCOMMITTED生效时这些死锁从不发生?对我来说,这将如何影响显示的update语句并不明显。 -
哇!没想到在这么短的时间内反应这么大!在 READ_UNCOMMITTED 下仍然会发生死锁,但只有当有很多很多的并发线程(大约 1000 个)在进行时。对于含糊其辞,我深表歉意。
标签: sql-server concurrency deadlock