我目前正在对一个SQL Server 2008数据库进行一些实验。更具体地说,我有一个使用数百个并发线程执行数千个任务的JDBC应用程序,每个任务都会在数据库上运行以下查询:
UPDATE from Table A where rowID='123'
然而,每当我将隔离级别设置为高于READ_UNCOMMITTED时,我都会遇到大量死锁错误(SQL Exception 1205)。即使我设置了行锁定、表锁定和独占锁提示,这种情况仍会发生!即使在不使用锁的快照隔离中(Snapshot Isolation),我仍然会遇到死锁错误。
我通过SQL Profiler运行跟踪以获得死锁图形,但它没有太大用处。它显示了受害进程,连接到一个“线程池”,连接到数百个其他进程。你可以在这里查看它:
http://i.stack.imgur.com/7rlv3.jpg
有人知道为什么会发生这种情况吗?我已经疯了几天了,试图找出原因。我目前的假设是与数据库实例中可用的工作线程、可用内存量或与实际查询级别锁无关的某些事物有关。
谢谢!
READ_UNCOMMITTED
生效时,这些死锁就永远不会发生了吗?我并不明白这会如何影响所示的update
语句。 - Martin Smith