问题标签 [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.

0 投票
6 回答
2804 浏览

java - 无锁数组元素交换

在多线程环境中,为了实现线程安全的数组元素交换,我们会进行同步锁定。

是否有可能在上述情况下使用下面的 API,以便我们可以进行无锁数组元素交换?如果是,如何?

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.html#compareAndSet%28T,%20V,%20V%29

0 投票
1 回答
2341 浏览

hibernate - Hibernate / DB2 -913 死锁

部署在多台机器上的应用程序 - 访问同一个数据库表。它读取 MIN 行,然后删除该行。

当这种情况同时发生时,我们会从 DB2 中得到一个 -913 错误,表示死锁。

已经尝试过以下选项 1. 锁定行。2. 应用程序代码中的重试机制,死锁发生后。

似乎没有任何效果。

任何想法/参考/解决方案?

0 投票
2 回答
8268 浏览

mysql - MySQL删除行的死锁

我们有一个(目前是 InnoDB)表,其中包含大约 500,000 行。这表示要运行的任务队列。它存储在 MySQL 数据库中。

在持续的基础上,至少每秒一次,但有时更频繁地,我们从中选择数据并随后更新一些行。每天一次,我们从表中删除旧行。

我们开始在桌面上遇到死锁,这使我们的任务处理陷入停顿。这些死锁是在夜间修剪运行期间造成的。DELETE、SELECT 和 UPDATE 的组合意味着基本上不会发生任何有成效的事情。不幸的是,我没有 SHOW ENGINE INNODB STATUS 的输出。

我想知道处理这个问题的最佳选择。请注意,我们的代码检测到死锁并重新发出查询。此外,我们很久以前就发现一次删除所有匹配的行对一个有很多活动的数据库表来说太费力了,所以我们一次将删除限制为 10,000 行,并继续重新发出查询,直到所有必要的行都被删除修剪。

我看到以下选项,并想就哪些是最佳选项提出意见,或对其他选项提出建议:

  1. 一次删除更少的行
  2. 在我们的 DELETE 上使用指数退避,尽管我担心这对我们的特定工作量没有帮助
  3. 根据MySQL 文档锁定表。我们可能会接受在删除期间阻塞 SELECT 和 UPDATE 语句。
  4. 切换到 MyISAM 表类型。我们选择 InnoDB 是因为我们最初在此表上使用事务。这已不再是这种情况。我对细节不够熟悉,不知道这是否是一个可行的解决方案。
  5. 也许使用 UPDATE LOW_PRIORITY。可能是 DELETE 不会影响 SELECT,只会影响 UPDATE,这可能就足够了。
0 投票
4 回答
3800 浏览

sql-server - sql server 2005 死锁在生产中超时,而不是在测试环境中:为什么?

在我的开发环境中,我试图重新创建我们在 MSSQL 2005 中面临的生产问题。这个问题有两个部分:

问题

1) 发生死锁,MSSQL 选择一个连接(“连接 X”)作为“受害者”。2) 所有后续使用“连接 X”的尝试都失败了(我们使用连接池)。MSSQL 说“服务器无法恢复事务”

在这两者中,#2 如果更严重的话:由于“连接 X”每次“循环”尝试重新使用“连接 x”都会失败 - 并且神秘的“随机”错误出现在用户面前。我们必须重新启动服务器。

我为什么写作

然而,在这一点上,我希望重新创建问题 #1。我可以轻松地制造死锁。

但这是我的问题:虽然在生产中,MSSQL 选择一个连接 (SPID) 作为“死锁受害者”,但在我的测试环境中,死锁只是挂起......然后挂起又挂起。永远?我不确定,但我把它挂了一夜,早上它仍然挂着。

那么问题来了:当死锁发生时,如何让 sql server “选择死锁受害者”?

迄今为止的尝试

我尝试通过 jdbc url 设置“lock_timeout”参数(“lockTimeout=5000”),但是我得到的消息与生产中不同(在测试中,“超过锁定请求超时期限。”而不是在生产中“事务(处理ID 59)与另一个进程在锁资源上死锁,并被选为死锁牺牲品。”)

关于问题 #2 的一些细节

我研究了这个“无法恢复交易”的问题,发现了一些事情:

  • 错误的异常处理可能会导致此问题。例如:java 代码不会关闭 Statement/PreparedStatement,并且驱动程序的“Connection”实现卡在了错误/陈旧/旧的“事务 ID”中
  • jdbc 驱动程序升级可能会使问题消失。

但是,现在,我只想重新创建死锁并使 sql server “选择死锁受害者”。

提前致谢!

附录 A. 技术环境

发展:

  • sql server 2005 SP3 (9.00.4035.00)
  • 驱动:sqljdbc.jar 1.0版
  • Jboss 3.2.6
  • jdbc url: jdbc:sqlserver://<>;

生产:

  • sql server 2005 SP2 (9.00.3042.00)
  • 驱动:sqljdbc.jar 1.0版
  • Jboss 3.2.6
  • jdbc url: jdbc:sqlserver://<>;

附录 B. 强制死锁的步骤

  • 获取连接 A
  • 获取连接 B
  • 使用连接 A 运行 sql1
  • 使用连接 B 运行 sql2
  • 使用连接 B 运行 sql1
  • 使用连接 A 运行 sql2

where sql1: update member set name = name + 'x' WHERE member_id = 71

sql2: 更新成员集名称 = 名称 + 'x' WHERE member_id = 72

0 投票
1 回答
1061 浏览

c# - 运行单元(集成)测试时的 ContextSwitchDeadlock

在测试中运行时出现以下错误:

该测试对服务层上的一个方法进行 WCF 调用,该方法使用实体框架从数据库中获取数据。数据也使用 EntLib 缓存应用程序块缓存在服务器端。

在服务器端测试相同代码的测试通过且没有错误。

0 投票
2 回答
14167 浏览

python - 多处理调试技术

我在调试多进程应用程序时遇到问题(特别是在 python 的多处理模块中使用进程池)。我有一个明显的僵局,我不知道是什么原因造成的。堆栈跟踪不足以描述该问题,因为它仅显示多处理模块中的代码。

是否有任何 python 工具或其他用于调试死锁的通用技术?

0 投票
3 回答
8979 浏览

sql-server - 如何更改 SQL Server 中的锁定策略?

我读过这样的文章:http: //www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and -Locks-Part-5-SQL-2005-Snapshots.htm

而且据我了解,SQL Server 有一个非常悲观的锁定策略。为了提高性能,我应该更改锁定的已提交读快照。

但我找不到在哪里执行此操作。我在哪里更改锁定策略?

0 投票
7 回答
2959 浏览

concurrency - 为什么无锁并发如此重要(在 Clojure 中)?

有人告诉我 Clojure 具有无锁并发,这很重要。

我使用了多种语言,但没有意识到它们在幕后执行锁定。

为什么这是 Clojure(或任何具有此功能的语言)的优势?

0 投票
6 回答
4754 浏览

deadlock - 死锁问题在编程中发生的频率如何?

我已经用多种语言进行了编程,但我不知道我的代码中存在死锁。

我认为这意味着它不会发生。

这是否经常发生(在编程中,而不是在数据库中)以至于我应该关注它?

0 投票
2 回答
583 浏览

ruby-on-rails - 在 Rails 代码中应该注意哪些类型的并发/死锁问题?

我刚刚意识到死锁 - 即它们是什么 - 我担心这个问题会影响我的 Rails 代码。

在开发 Rails 应用程序时,是否有任何特定的死锁问题需要注意?

你有没有在你的 Rails 代码中遇到过死锁——或者这可能吗?

(我指的不是数据库死锁——只是应用程序死锁)。