gpt4 book ai didi

mysql - 如果在 MySQL 中同时运行,我的 UPDATE 语句可以工作吗?

转载 作者:行者123 更新时间:2023-11-29 16:40:00 26 4
gpt4 key购买 nike

我看到了很多类似的问题,但我仍然不确定我是否正确。

我们有一个应用程序,可以启动一项任务来批量发送许多消息。消息传递状态稍后会分批接收,并且没有特定的顺序。

表结构如下:-

CREATE TABLE `message` (
`pk` char(32) NOT NULL DEFAULT '',
`job_id` varchar(40) DEFAULT NULL,
`status` varchar(40) DEFAULT NULL,
`update_date` datetime DEFAULT NULL,
PRIMARY KEY (`pk`),
KEY `job_id` (`job_id`),
KEY `status` (`status`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

最初创建记录时,status 设置为 null。其值预计将从 null 更改为 sent,然后更改为 delivered。以下语句用于更新记录。

当要设置的状态为 - 已交付

Update message SET status = 'delivered', update_date = Now()
WHERE job_id = :someId

当要设置的状态为 - 已发送

Update message SET status = 'sent', update_date = Now()
WHERE job_id = :someId AND status IS NULL

问题是,可能有两个线程同时尝试将同一记录的状态设置为“已发送”和“已发送”。在本例中,“已交付”是最终状态,因此我们希望最终获胜。

上述语句在 MySql 或 MariaDB 中能确保这一点吗?

最佳答案

是的,在 MySQL 和 MariaDB(可能还有任何 SQL 数据库)中。对同一行的更新是原子的。

  • “sent”会覆盖 NULL,但不会覆盖“delivered”
  • “已交付”将覆盖 NULL 和“已发送”

这就是你想要的。只需在更新之前确保具有给定 job_id 的消息存在:)

关于mysql - 如果在 MySQL 中同时运行,我的 UPDATE 语句可以工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398715/

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