问题标签 [deadlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - SQL Server 2000 死锁
我们在生产 SQL Server 2000 数据库中遇到了一些非常烦人的死锁情况。
主要设置如下:
- SQL Server 2000 企业版。
- 服务器使用 ATL OLE 数据库以 C++ 编码。
- 所有数据库对象都通过存储过程进行访问。
- 所有 UPDATE/INSERT 存储过程都将其内部操作包装在 BEGIN TRANS ... COMMIT TRANS 块中。
我在网上收集了几篇类似这样的文章后,用 SQL Profiler 收集了一些初步的痕迹(忽略它是指 SQL Server 2005 工具,同样的原则适用)。从跟踪来看,这似乎是两个 UPDATE 查询之间的死锁。
我们已经采取了一些措施来降低问题发生的可能性,例如:
- 选择(不锁定)。我们已将存储过程中的所有 SELECT 查询更改为使用 WITH (NOLOCK)。我们了解脏读的含义,但查询的数据并不那么重要,因为我们进行了大量的自动刷新,并且在正常情况下 UI 将具有正确的值。
- 阅读未提交。我们已将服务器代码上的事务隔离级别更改为 READ UNCOMMITED。
- 缩小交易范围。我们减少了事务被保持的时间,以最大限度地减少发生数据库死锁的可能性。
我们还质疑我们在大多数存储过程中都有一个事务(BEGIN TRANS ... COMMIT TRANS 块)。在这种情况下,我的猜测是事务隔离级别是 SERIALIZABLE,对吧?如果我们在调用存储过程的源代码中也指定了事务隔离级别,那又会怎样呢?
这是一个处理密集型应用程序,我们在数据库中大量读取(更大的百分比)和一些写入。
如果这是一个 SQL Server 2005 数据库,我可以使用Geoff Dalgas 回答有关 Stack Overflow 的死锁问题,如果这甚至适用于我遇到的问题。但目前升级到 SQL Server 2005 并不是一个可行的选择。
由于这些最初的尝试失败了,我的问题是:你将如何从这里开始?您将采取哪些步骤来减少甚至避免发生死锁,或者我应该使用哪些命令/工具来更好地暴露问题?
python - 为什么没有人关心这个 MySQLdb 错误?这是一个错误吗?
TL;DR:我已经为我发现的一个错误提供了一个补丁,并且我得到了 0 个反馈。我想知道这是否是一个错误。这不是咆哮。请阅读此内容,如果您可能受到它的影响,请检查修复。
几周前我发现并报告了这个 MySQLdb 错误(编辑:6 周前),发送了一个补丁,将其发布在几个 ORM 的论坛上,邮寄了 MySQLdb 作者,邮寄了一些谈论处理死锁的人,邮寄了 ORM 作者和我'仍在等待任何形式的反馈。
这个错误让我很伤心,我能在反馈中找到的唯一解释是,要么没有人在带有 mysql 的 python 中使用“SELECT ... FOR UPDATE”,要么这不是一个错误。
基本上问题是在使用 MySQLdb 游标发出“SELECT ... FOR UPDATE”时不会引发死锁和“锁定等待超时”异常。相反,该语句会静默失败并返回一个空结果集,任何应用程序都会将其解释为没有匹配的行。
我已经测试了SVN版本,它仍然受到影响。在默认安装的 Ubuntu Intrepid、Jaunty 和 Debian Lenny 上进行了测试,这些也受到影响。easy_install (1.2.3c1) 安装的当前版本受到影响。
这也会影响 SQLAlchemy 和 SQLObject,并且可能任何使用 MySQLdb 游标的 ORM 也会受到影响。
该脚本可以重现将触发错误的死锁(只需更改用户/在 get_conn 中传递,它将创建必要的表):
在未打补丁的 MySQLdb 上运行它的输出是这样的:
您可以看到 Thread-2 从我们知道有 1 的表中获得了 0 行,并且只发出“SHOW WARNINGS”语句,您可以看到发生了什么。如果您检查“SHOW ENGINE INNODB STATUS”,您将在日志“*** WE ROLL BACK TRANSACTION (2)”中看到这一行,在 Thread-2 上选择失败后发生的所有事情都是半回滚事务。
应用补丁后(检查票证,下面的 url),这是运行脚本的输出:
在这种情况下,在 Thread-2 上会引发异常并正确回滚。
那么,你的意见是什么?,这是一个错误吗?没人关心还是我疯了?
这是我在 SF 上开的票:http: //sourceforge.net/tracker/index.php ?func=detail&aid=2776267&group_id=22307&atid=374932
sql-server-2008 - SELECT/UPDATE 死锁
我在 SQL Server 2008 上的 SELECT/UPDATE 上遇到死锁问题。我从这个线程中阅读了答案:SQL Server deadlocks between select/update or multiple selects但我仍然不明白为什么会出现死锁。
我在以下测试用例中重新创建了这种情况。
我有一张桌子:
我首先尝试从该表中选择一条记录,如果该记录存在,则将过期时间设置为当前时间加上一些间隔。它是使用以下代码完成的:
然后,如果我尝试从两个线程执行测试方法并且他们尝试更新相同的记录,我会得到以下输出:
我无法理解使用可序列化隔离级别是如何发生的。我认为第一个选择应该锁定行/表,并且不会让另一个选择获得任何锁。该示例是使用命令对象编写的,但仅用于测试目的。最初,我使用的是 linq,但我想展示简化的示例。Sql Server Profiler 显示死锁是键锁。我将在几分钟内更新问题并从 sql server profiler 发布图表。任何帮助,将不胜感激。我知道这个问题的解决方案可能是在代码中创建关键部分,但我试图理解为什么 Serializable Isolation Level 不起作用。
这是死锁图: 死锁 http://img7.imageshack.us/img7/9970/deadlock.gif
提前致谢。
sql-server - 在 MS SQL Server 中尽量减少锁定附加表的建议?
我正在编写一些将在生产中运行的日志记录/审计代码(不仅仅是在抛出错误时或在开发时)。在阅读了 Coding Horror 在死锁和日志记录方面的经验后,我决定应该寻求建议。(Jeff 的“不记录”解决方案对我不起作用,这是法律规定的安全审计)
是否有合适的隔离级别来最小化争用和死锁?我可以添加到插入语句或存储过程中的任何查询提示?
我非常关心除审计表之外的所有事务的事务完整性。这个想法是,将记录这么多,如果一些条目失败,这不是问题。如果日志记录停止了其他一些事务——那就不好了。
我可以登录到数据库或文件,尽管登录到文件的吸引力较小,因为我需要能够以某种方式显示结果。记录到文件将(几乎)保证记录不会干扰其他代码。
c# - 为什么以下 SQL Server 在事务中运行时会插入死锁?
我目前正在向 SQL Server 表中插入一条记录,然后选择自动增量 ID,如下所示:
(这是使用 Linq-to-SQL 生成的)。出于某种原因,当我使用具有可序列化隔离级别的 TransactionScope 对象在事务中运行此代码时,SQL Server 会引发死锁错误。我分析了死锁图事件,发现涉及的两个进程都在等待对方执行转换操作,据我了解以下信息:
我的理解是事务范围会阻止第二个进程执行插入,直到第一个进程完成插入和选择身份。然而,情况似乎并非如此。任何人都可以阐明以线程安全的方式实现我所要求的最佳方法吗?
--更新--
只是要注意; 我 99% 确定两个进程之间没有共享连接,因为每个进程都创建了一个新的 DataContext 来与数据库通信。
--再次更新--
Remus Rusanu 指出,一些遗漏的信息与问题有关,我尝试根据死锁图报告简化场景,但我在此处扩展了解释。在执行插入之前,我对相关表执行存在查询以确定标记是否已存在。如果是,我结束交易。如果不是,则插入应该继续,然后我在具有Some_Int
作为主键的表上执行更新(此处未显示),尽管更新纯粹是针对最后修改的值。Tag 表有一个由 auto inc ID 和 Some_Int 组成的聚集索引也很重要。我不认为这最后一条信息是相关的,因为我尝试将表更改为仅将 auto inc 字段作为主键/聚集索引无济于事。
谢谢。
sql-server - SQL server 2005 死锁情况
- SQL Server 发生死锁的可能情况有哪些?
- 遇到这种情况怎么解决?
multithreading - 在 MT 程序中调试死锁线程?
除了 gdb,还有哪些可能的方法来调试 MT 程序中的死锁线程?
multithreading - 避免多线程进程中的死锁
为了避免死锁,有人应该遵循哪些最佳实践/习惯用法?
deadlock - 临界区负锁计数
我正在调试死锁问题,调用堆栈显示线程正在等待某些事件。
代码使用临界区作为同步原语我认为这里有一些问题。此外,调试器指向某个其他线程拥有的临界区,但锁定计数为 -2。根据我的理解 lock count>0 意味着关键部分被一个或多个线程锁定。
那么有没有可能我正在查看正确的关键部分,这可能是死锁的罪魁祸首。
在什么情况下临界区可以有负锁计数?
java - Java 线程在调用 select() 时向选择器注册通道时阻塞。该怎么办?
我有一个基本问题。为什么以及如何 SelectableChannel 的 register 方法可以阻塞调用。让我提供一个场景。
我在类 Register 中创建了一个 Selector 对象,如下所示。
我在同一个类(Register)中也有一个方法来向选择器注册通道。
还有一个名为 Request 的类,它具有从通道读取数据、处理并调用以下方法来注册通道的方法。
此时线程被阻塞,没有给出它在等待什么的线索。我已验证选择器已打开。请为我提供一些帮助以了解如何解决此问题。有没有我可以释放的锁。
任何输入将不胜感激。
添加到我所描述的内容。进一步的测试表明,如果从同一个线程调用 Register.register 方法,它可以注册,但之后如果其他线程尝试调用该方法,则线程不会继续前进。