gpt4 book ai didi

MySQL select for update,确保一行/值只使用一次?

转载 作者:行者123 更新时间:2023-11-28 23:12:30 25 4
gpt4 key购买 nike

根据我的阅读,我相信 SELECT FOR UPDATE 将用于完成以下操作,但我读到类似于“行锁定不会停止读取”的评论,这让我觉得我遗漏了一些东西。请原谅我的伪代码。

table 'first_names'

`name` `used`
mike 1
jeff null
mark null

我需要从这个表中获取一个名称,但绝对 100% 确保它以前从未被使用过,也没有被其他任何东西使用过。 (一个假的例子,假设我们自动分配用户名——当有人在我们的网站上创建一个帐户时,它必须是唯一的)为了完成这个,当我从这个表中获取/使用一个名字时,我们设置 used = 1。

但问题当然是两个独立的进程在执行 select where used <> 1如果进程 #1 没有update used = 1,那么两者都可以得到“jeff”在进程 #2 运行之前 select where used <> 1 .

事务中的 SELECT FOR UPDATE 是否解决了这个问题?我知道它会锁定该行,以便另一个进程无法写入 到该行,但我们正在进行读取和选择。意思是进程 #1 和进程 #2 都运行 select where null <> 1同时,得到同一行 (jeff)。进程 #1 写入行,update used = 1 ,释放锁,现在进程 #2 也写入该行....现在该行 jeff 已被使用两次。

最佳答案

另一种方法是使用日志/事务表。

 NameUsed
----------
Mike

您首先检查该名称是否未被使用

从日志中选择 count(*) where nameused='jeff'

这两个进程都返回“0”,相对确定名称是免费的,两个进程都运行:

插入日志 (NameUsed) values('jeff');

诀窍是 NameUsed 是一个 UNIQUE 列,您的 DBMS 将只允许您的一个进程成功插入名称,一个将失败并显示“必须是唯一的” '这比'被其他用户锁定'更有帮助。

此方法优化了写入速度并最大限度地减少了主表的锁定。

虽然检查名称是否已被使用会稍微慢一些,但如果有适当的索引,速度不会太慢。

关于MySQL select for update,确保一行/值只使用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45313061/

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