gpt4 book ai didi

java - MySQL 选择更新和插入

转载 作者:行者123 更新时间:2023-11-29 18:25:11 25 4
gpt4 key购买 nike

我正在运行一个多线程应用程序,并且在不同线程尝试访问特定表中的相同记录时遇到问题。

线程A- 想要表“LastOperations”中的最后一条记录,因此按 ID desc LIMIT 1 执行“选择更新”订单。- 根据 LastOpertaions 表中的最后一条记录创建一条新记录并插入回其中。

线程B- 想要表“LastOperations”中的最后一条记录,因此执行与线程 A 相同的 Activity 。

两个线程都是相同的代码。只是使用不同的数据进行操作。此表中一次最大 Activity 线程数为 4-6。

问题如果线程 A 锁定 ID 为 1000 的最后一条记录,则线程 B 将获取 999 条记录并向表中添加新条目。 ID字段是一个自增字段,也是主键。

假设线程 1 正在购买原 Material A,线程 b 正在购买原 Material B。两者都应通过采用最新条目从同一帐户中扣除。发生的情况是一个线程从帐户中获取较旧的条目,导致帐户余额出现错误。

对我缺少的东西有什么建议吗?数据库端需要进行任何更改吗?

最佳答案

我相信您遇到的问题是 Transaction Isolation Level 。线程 A 尚未完成其记录的创建。所以,当线程B从“LastOperations”中获取到的最新记录为999时,999确实是表中的最后一条记录。

您可以将事务隔离级别更改为 READ UNCOMMITTED(如果您可以控制 MySQL 实例),但这是有风险的。如果允许脏读,那么线程A生成的完整记录可能不会在数据库中最终确定。 (因此,“脏读”中的“脏”。)

关于java - MySQL 选择更新和插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46253267/

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