问题标签 [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 投票
3 回答
7530 浏览

mysql - 未提交读取的 InnoDB 死锁!- Java - Glassfish - EJB3 (JPA/休眠)

几天前,我在使用 Glassfish 的 Java 应用程序上遇到死锁问题 - EJB3 和 Mysql InnoDB

配置:Mysql InnoDB:Ver 14.12 Distrib 5.0.51a,适用于 debian-linux-gnu (i486),使用 readline 5.2

应用服务器:Glassfish v2.1

EJB3 的持久性 - JPA - Hibernate

为了简单起见,我有一个带有 servlet 的 SOA 系统,用于处理用户对服务的订阅、登录、注销、支付和注册等......生成“低信用”警告、付款验证等...

我的问题:在负载测试期间我到处都是死锁(100 000 个用户模拟 - 30 个请求/秒)

返回的堆栈样本:

注意结尾,这是我完成的代码:net.xxx.server.dao.impl.PaymentDAOImpl.listPaymentsByStateAndCompany(PaymentDAOImpl.java:270)

这个功能:

此功能在不进行负载测试时运行良好,例如我们每 5 秒有 1 个请求。

在负载测试期间,我们的作业运行频率很高(例如每 5 秒)。

我不仅得到这个错误,还有其他一些其他工作的错误(仍然死锁)!

在 MYSQL 上:

死锁示例:

事务隔离

我在互联网上阅读了有关事务隔离的内容。

在 glassfish 上,我们可以设置事务隔离级别,我把它设置为未提交的。

它没有用,然后我在mysql中设置了相同的级别:

SVP 有人可以告诉我可能是什么问题吗?我真的不知道!!!!

顺便说一句,我在互联网上看到您可以为每个请求选择事务隔离级别...是否可以直接为 JPA 上的方法设置事务隔离级别?因为我认为只有进行全局数据更新的工作(比如减少 15000 个服务)应该是未提交的,我错了吗?

0 投票
3 回答
1946 浏览

python - Python 嵌入线程——避免死锁?

有没有办法嵌入 python,允许从 python 到 C++ 的回调,允许 Pythhon 代码产生线程,并避免死锁?

问题是这样的:

  • 要调用 Python,我需要持有 GIL。通常,我首先创建解释器时获取主线程状态,然后使用 PyEval_RestoreThread() 获取 GIL 并在调用 Python 之前交换线程状态。

  • 从 Python 调用时,我可能需要访问一些受主机中单独的临界区保护的受保护资源。这意味着 Python 将持有 GIL(可能来自我最初调用的其他线程),然后尝试获取我的保护锁。

  • 当调用 Python 时,我可能需要持有相同的锁,因为我可能正在迭代某些对象集合。

问题是,即使我在调用 Python 时持有 GIL,Python 也可能会放弃它,将其交给另一个线程,然后让该线程调用我的主机,期望获取主机锁。同时,主机可以获取主机锁和 GIL 锁,并调用 Python。出现僵局。

这里的问题是,当我调用 GIL 时,Python 将 GIL 放弃给另一个线程。这就是它所期望的,但是它使得顺序锁定成为不可能——即使我首先使用 GIL,然后使用我自己的锁,然后调用 Python,Python 将从另一个线程调用我的系统,期望使用我自己的锁(因为它通过释放 GIL 来取消对 GIL 的排序)。

我不能真正让我的系统的其余部分使用 GIL 来处理系统中所有可能的锁——这甚至不能正常工作,因为 Python 可能仍会将它释放到另一个线程。

我也不能真正保证我的主机在进入 Python 时不会持有任何锁,因为我无法控制主机中的所有代码。

那么,难道就只有这样就做不到了吗?

0 投票
6 回答
8268 浏览

sql - 什么时候适合使用 NOLOCK?

我不时遇到一些长时间运行的查询超时问题和死锁。

我想知道什么时候最适合使用 NOLOCK 以及在哪里使用?

我是否在更新和插入中使用它?或阅读?

0 投票
7 回答
7405 浏览

sql-server - SQLServer 死锁

我有一个 Java 应用程序,它在数据库上执行多个并发 CRUD 操作。我正在添加对 SQLServer 的支持,但在并发删除期间遇到死锁问题。经过一些调查,问题似乎是由于特定表上的锁升级。

为了修复它,我决定使用 UPDLOCK 提示对有问题的表进行所有读取以“更新”,这样就可以避免死锁。但是,我仍然看到了问题。我在 SQLServer 中启用了跟踪,并在 SQLServer 日志中发现了以下死锁跟踪:

遇到死锁....打印死锁信息等待图

节点:1 密钥:5:72057594042384384(54048e7b3828)CleanCnt:3 模式:X 标志:0x0 授权列表 1:所有者:0x03D08C40 模式:X Flg:0x0 参考:0 寿命:02000000 SPID:62 ECID:0 XactLockInfo:0x04834274 SPID: 62 ECID:0 语句类型:DELETE 行号:1 输入缓冲区:语言事件:(@P0 nvarchar(4000))delete from part_data where part_id = @P0 请求者:ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 模式: U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378) Value:0x3d08500 Cost:(0/1296)

节点:2

KEY: 5:72057594042384384 (f903d6d6e0ac) CleanCnt:2 Mode:X Flags: 0x0 Grant List 0: Owner:0x03D088A0 Mode: X Flg:0x0 Ref:0 Life:02000000 SPID:60 ECID:0 XactLockInfo:0x04B511EC SPID:60 ECID: 0 语句类型:DELETE 行号:1 输入缓冲区:语言事件:(@P0 nvarchar(4000))delete from part_data where part_id = @P0 请求者:ResType:LockOwner Stype:'OR'Xdes:0x04834250 模式:U SPID: 62 BatchID:0 ECID:0 TaskProxy:(0x047BA378) 值:0x3d089e0 成本:(0/4588)

受害者资源所有者:ResType:LockOwner Stype:'OR'Xdes:0x04B511C8 模式:U SPID:60 BatchID:0 ECID:0 TaskProxy:(0x058BE378)值:0x3d08500 成本:(0/1296)

SQLServer 探查器将此显示为两个客户端持有更新 (U) 锁并试图升级为独占 (X) 锁。我读过的 SQLServer 文档说,在给定时间,只有一个客户端可以在表上拥有 (U) 锁,所以我想知道为什么我会看到跟踪中显示的情况。

该跟踪中引用的数据库对象是外键上的索引。如果有解决此类问题经验的人可以提供建议,那将是一个很大的帮助。

谢谢,布拉德。

编辑按要求添加了死锁图xml:

0 投票
8 回答
9615 浏览

sql-server - 是否可以创建具有只读访问权限的死锁?

我有一个 VB6 应用程序通过 ADO 访问 MSSQL2000 服务器上的单个表。我正在使用只读访问(adOpenStatic、adLockReadOnly) 网络中还有其他应用程序会对表进行更改。

出于某种原因,我收到关于我的应用程序被选为死锁受害者的错误。

我真的很困惑:当我只是从一个表中读取时,为什么会出现死锁?我希望超时,因为其他应用程序的编写,但不是死锁......

有人可以对此有所了解吗?

更新:2009-06-15我仍然对这个问题的解决方案感兴趣。所以我提供了更多信息:

  • 如果我选择 adOpenForwardOnly 或 adOpenStatic 没有区别
  • 如果光标位置是客户端或服务器,则没有区别。
0 投票
4 回答
3076 浏览

sql - Oracle死锁检测工具

我正在寻找一个 Oracle 查询和 PL/SQL 过程(触发器、约束等)的静态分析器 - 一个将传递我们的数据库方案并指向潜在死锁的工具。就像Java 的FindBugs一样。

如果这样的工具不存在,你想要吗?

0 投票
4 回答
4329 浏览

java - j2me 网络、线程和死锁

下面的一段简单的 midlet 代码(Moo 类)(在摘录之后)死锁(至少我认为在阅读这里关于线程的帖子后它会死锁

我已经复制了帖子的相关摘录:

问题的根源在于 open() 调用的阻塞特性。在某些平台上,系统在幕后进行实际连接,相当于一个单独的线程。调用线程阻塞,直到连接线程建立连接。同时,安全子系统可能要求用户确认连接,连接线程阻塞,直到事件线程得到用户的确认。发生死锁是因为事件线程已经在等待连接线程。

有人可以告诉我系统线程调用是如何在这里完成的(事件和通知线程)以及导致死锁的事件序列。我不清楚这里涉及哪些线程导致死锁。

  1. 有没有关于 j2me 线程模型的文档?
  2. 我在哪里可以获得 j2me 系统类的源代码(我想查看 Connection 类的实现)?

编辑:在上面的代码中,我得到了逻辑。但是下面的代码至少应该可以正常工作吗?这也导致我在一个单独的线程中进行网络连接的死锁。

code>

0 投票
1 回答
386 浏览

multithreading - DCOM/ COM+ 激活的对象会死锁 CPU 吗?

如何计算 COM+ 应用程序的 CPU 级死锁?这是一个在 Win2K 上运行的应用程序。无论负载如何,所有其他对象都使用的 1 个对象开始突然增加调用时间,然后系统崩溃。将系统恢复到正常工作状态的唯一方法是重新启动 COM+ 应用程序。

有趣的是,这种情况无法在 QA 或 DEV 中重现。唯一的区别是 CPU 头数和内存。

COM+ 应用程序是 n 层模型中的应用程序组件,它使用 MSDAORA 连接到使用 v9.2 客户端的 Oracle v9.2 DB。

任何想法/想法都非常受欢迎。

0 投票
6 回答
30384 浏览

c# - 使用 lock(this) 说明死锁的示例代码

我读过几篇文章和帖子说lock(this),都是不好的做法,因为另一个线程可能会锁定同一个键并导致死锁lock(typeof(MyType))lock("a string")为了理解这个问题,我试图创建一些示例代码来说明死锁,但一直无法解决这个问题。

有人可以写一段简明的代码来说明这个经典问题吗?请保持简短,我只能以较小的块消化代码。

编辑: 我认为 lassevk 总结得很好;真正的问题是你失去了对锁的控制。一旦发生这种情况,您将无法控制调用锁的顺序,并且您正在允许潜在的死锁情况。

lock(this), lock(typeof(MyType)), 等等都是您选择了无法控制的锁的情况。

0 投票
4 回答
80983 浏览

asp.net - 如何查看 SQL 2008 锁和阻塞表

在我的应用程序的 ASP.NET 执行期间,似乎 SQL 2008 Express 持有一些锁,我得到

操作或服务器没有响应

也许我的一些查询没有优化。Visual Studio 崩溃:

您保存所有文件并退出。

我需要查看阻止我的表的查询,但我有 Express 版本。我能怎么做?

谢谢