gpt4 book ai didi

java - 事务(进程 ID)在锁定时陷入僵局 |与另一个进程的通信缓冲区资源,并已被选为死锁牺牲品

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:18 24 4
gpt4 key购买 nike

我有一个 Java 程序可以更新 MS SQL 中的表。 Web 用户也可以通过在 ColdFusion 中创建的网站访问此表

最近我在以下行时遇到此错误:

sql_stmt.executeUpdate("update random_selection "
+ "set forecasted = 1 where "
+ " randnum = " + ora_rs.getString("RANDNUM")
+ " and quarter = " + quarter
+ " and ozip3 = " + ora_rs.getString("OZIP3"));

出错的 CF 查询是:

<cfquery name="submit_forecast" datasource="ttmsdropper" username="#request.db_username#" password="#request.db_password#">
INSERT INTO forecast_entry
VALUES (<cfqueryparam value="#currentRecord[8]#">)
</cfquery>

是什么导致了这个错误,我该如何解决?

最佳答案

当 2 个进程试图同时访问相同的数据时会发生死锁 - 两个进程对数据的声明相同。当有很多更新/插入 Activity 正在进行时(如您所描述的),这是最常见的。数据库系统“选择”其中一个交易作为“赢家”。

在某些情况下,死锁可能会通过索引得到改善或减轻,但只有在涉及选择时才会如此——一个好的索引策略可能会提高选择性能并使行锁定更有效。但是,如果死锁来自与更新竞争的插入,索引将无济于事。事实上,激进的索引可能会使情况恶化,因为索引必须与数据插入或更新一起更新。

如何解决它在很大程度上取决于您的系统和您要做什么。您必须最小化插入/更新锁定或以某种方式提供更多或更快的资源。将插入捆绑在一起并对其进行批处理、更多进程或 RAM(有时 - 并非总是)、集群、拆分表和数据、微调并行性——这些都是可行的选择。并且没有硬性规定。

关于java - 事务(进程 ID)在锁定时陷入僵局 |与另一个进程的通信缓冲区资源,并已被选为死锁牺牲品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915667/

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