我目前正在SQL Server 2008数据库上进行一些实验。更具体地讲,我有一个使用数百个并发线程的执行数千个任务JDBC应用程序,每个运行数据库以下查询:SQL Server 2008:发生死锁...没有任何锁
UPDATE from Table A where rowID='123'
但是,我得到一吨的死锁错误的( SQL异常1205),只要我将隔离级别设置为高于READ_UNCOMMITTED。即使我设置了行锁定,表锁定和排他锁提示,它也会发生!即使在不使用锁的快照隔离中,我仍然会遇到死锁错误。
我通过SQL Profiler运行了一个跟踪,以便在发生这种情况时获取死锁图形,但它没有多大用处。它显示受害者进程连接到一个“线程池”,连接到数百个其他进程。您可以点击此处查看:
http://i.stack.imgur.com/7rlv3.jpg
没有人有任何线索,为什么发生这种情况?在过去的几天里,我一直在疯狂地试图找出答案。我目前的假设是,它与我的数据库实例中可用的工作线程,可用内存量或与实际查询级别锁无关的事情有关。
谢谢!
[看过这个了吗?](http://blogs.msdn.com/b/bartd/archive/2008/09/24/today-s-annoyingly-unwieldy-term-intra-query-parallel-thread- deadlocks.aspx)你的更新语句是否有一个并行计划? – 2011-03-28 21:32:43
你是说''READ_UNCOMMITTED'生效时,这些死锁**永远不会发生?对我来说,这并不明显,这将如何影响所显示的'update'语句。 – 2011-03-28 21:41:08
哇!在这么短的时间内,我并不期待这种压倒性的反应!在READ_UNCOMMITTED下仍然会发生死锁,但是只有当有很多很多并发线程正在进行时(大约为1000),才会发生死锁。我对这种模糊性表示歉意。 – akwok 2011-03-28 23:27:02