gpt4 book ai didi

mysql - 如何锁定尚不存在的 InnoDB 行?

转载 作者:IT老高 更新时间:2023-10-28 23:56:26 27 4
gpt4 key购买 nike

我如何保证我可以搜索我的数据库中是否存在用户名,然后将该用户名作为新行插入到数据库中,而无需在 SELECTINSERT 语句?

几乎就像我锁定了一个不存在的行。我想用用户名 "Foo" 锁定不存在的行,这样我现在可以检查它是否存在于数据库中,如果它不存在则将其插入数据库任何中断。

我知道使用 LOCK IN SHARE MODEFOR UPDATE 存在,但据我所知,这只适用于已经存在的行。我不确定在这种情况下该怎么做。

最佳答案

虽然上面的答案是正确的,因为 SELECT ... FOR UPDATE 将阻止并发 session /事务插入相同的记录,但这并不是全部事实。我目前正在与同样的问题作斗争,并且得出的结论是 SELECT ... FOR UPDATE 在这种情况下几乎没有用,原因如下:

并发事务/ session 也可以对相同的记录/索引值执行 SELECT ... FOR UPDATE,MySQL 会很高兴地立即接受(非阻塞)并且不会抛出错误。当然,一旦其他 session 完成了该操作,您的 session 也无法再插入记录。您或其他 session /事务也不会获得有关情况的任何信息,并认为他们可以安全地插入记录,直到他们真正尝试这样做。然后尝试插入会导致死锁或重复键错误,具体取决于具体情况。

换句话说,SELECT ... FOR UPDATE 会阻止其他 session 插入相应的记录,但是即使您执行 SELECT ... FOR UPDATE 并且找不到相应的记录,您也可以'实际上并没有插入该记录。恕我直言,这使得“先查询,然后插入”方法无用。

问题的原因是 MySQL 没有提供任何方法来真正锁定不存在的记录。两个并发 session /事务可以同时锁定不存在的记录“FOR UPDATE”,这实际上是不可能的,并且使开发变得更加困难。

解决此问题的唯一方法似乎是使用信号量表或在插入时锁定整个表。有关锁定整个表或使用信号量表的更多引用信息,请参阅 MySQL 文档。

只要我的 2 美分 ...

关于mysql - 如何锁定尚不存在的 InnoDB 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17068686/

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