gpt4 book ai didi

sql-server - SQL Server 2008 : Getting deadlocks. ..没有任何锁

转载 作者:行者123 更新时间:2023-12-02 19:00:13 25 4
gpt4 key购买 nike

我目前正在 SQL Server 2008 数据库上进行一些实验。更具体地说,我有一个 JDBC 应用程序,它使用数百个并发线程来执行数千个任务,每个任务都在数据库上运行以下查询:

UPDATE from Table A where rowID='123'

但是,每当我将隔离级别设置为高于 READ_UNCOMMITTED 时,我都会收到大量死锁错误(SQL 异常 1205)。即使我设置了行锁定、表锁定和独占锁定提示,也会发生这种情况!即使在不使用锁的快照隔离中,我仍然会遇到死锁错误。

我通过 SQL Profiler 运行了一次跟踪,以获取发生这种情况时的死锁图,但它没有多大用处。它显示了受害者进程,连接到“线程池”,连接到数百个其他进程。您可以在这里查看:

/image/7rlv3.jpg

有谁知道为什么会发生这种情况吗?在过去的几天里,我一直在疯狂地试图找出答案。我当前的假设是,它与数据库实例中的可用工作线程、可用内存量有关,或者与实际查询级锁无关。

谢谢!

最佳答案

你遇到了一个更深奥的野兽:资源死锁。您所拥有的线程无法生成子任务( sys.dm_os_tasks )来执行其工作,因为所有工作线程( sys.dm_os_workers )都很忙。反过来,忙碌的工作人员执行被受害者阻止的任务(可能是在普通锁上)。

我在这里看到两个教训可以带回家:

1)您发布的更新正在尝试并行。如果更新与您发布的完全相同,那么这意味着一件事:rowId 上没有索引。

2) 您已经弹到 max worker threads 设置的上限环境。毫不奇怪,考虑到您在客户端中滥用线程(数百个并发线程来执行数千个任务)并由于不需要的并行性而在服务器中倍增。

明智的设计应该在真正的异步连接 ( BeginExecuteNonQuery ) 上使用异步执行 ( AsynchronousProcessing=true ),并使用待处理请求池,这样它就不会超过某个阈值。更有可能的是,您将通过 table valued parameter 传递整批更新值。然后在一条语句中批量更新整个集合或行。我知道我的所有链接都是针对 .Net 的,而不是针对 Java 的,我不在乎,您可以自己挖掘等效的 Java 功能。

所以,虽然你发现了这样一个深奥的僵局很有趣,但它之所以出现只是因为你的设计,嗯......很糟糕。

关于sql-server - SQL Server 2008 : Getting deadlocks. ..没有任何锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com