一尘不染

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

mysql

如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而SELECTand INSERT语句之间没有任何截距?

几乎就像我锁在不存在的行上。我想用用户名 “ Foo”
锁定不存在的行,以便现在可以检查数据库中是否存在该行,并将其插入数据库(如果尚不存在的话)将其插入数据库。

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


阅读 350

收藏
2020-05-17

共1个答案

一尘不染

如果存在索引username(应该是索引,如果没有,则添加一个,最好是UNIQUE一个),那么发出a SELECT * FROM user_table WHERE username = 'foo' FOR UPDATE;将阻止任何并发事务创建该用户(以及“上一个”和“下一个”索引不唯一时的可能值)。

如果找不到 合适的 索引(满足WHERE条件),则不可能进行有效的记录锁定,并且整个表都将被锁定*。

该锁将一直保持到发出的交易结束SELECT ... FOR UPDATE

这些手册页中可以找到关于此主题的一些非常有趣的信息。

2020-05-17