如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而SELECTand INSERT语句之间没有任何截距?
SELECT
INSERT
几乎就像我锁在不存在的行上。我想用用户名 “ Foo” 锁定不存在的行,以便现在可以检查数据库中是否存在该行,并将其插入数据库(如果尚不存在的话)将其插入数据库。
我知道使用LOCK IN SHARE MODE和FOR UPDATE存在,但据我所知,仅适用于已经存在的行。我不确定在这种情况下该怎么办。
LOCK IN SHARE MODE
FOR UPDATE
如果存在索引username(应该是索引,如果没有,则添加一个,最好是UNIQUE一个),那么发出a SELECT * FROM user_table WHERE username = 'foo' FOR UPDATE;将阻止任何并发事务创建该用户(以及“上一个”和“下一个”索引不唯一时的可能值)。
username
UNIQUE
SELECT * FROM user_table WHERE username = 'foo' FOR UPDATE;
如果找不到 合适的 索引(满足WHERE条件),则不可能进行有效的记录锁定,并且整个表都将被锁定*。
WHERE
该锁将一直保持到发出的交易结束SELECT ... FOR UPDATE。
SELECT ... FOR UPDATE
在这些手册页中可以找到关于此主题的一些非常有趣的信息。