我看到了许多类似的问题,但我仍然不确定自己是否正确。
我们有一个应用程序可以启动一个作业来批量发送许多消息。邮件传递状态将在以后分批接收,而不是按特定顺序接收。
表格结构如下:
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
设置为空。其值应从空更改为
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中的这一点吗?