PHP Mysql SELECT ... FOR UPDATE逐一读取每个记录

时间:2019-05-07 14:56:41

标签: mysql

紧跟着该线程How many rows will be locked by SELECT ... ORDER BY xxx LIMIT 1 FOR UPDATE?,因为这很可能是我的第一个目标,我想确认一下正确读取每一行的正确方法,而不会导致并发读取之间发生冲突。

一个典型的例子,您有一个带有密码的表,可以提供给客户。您需要确保两个并发请求具有相同的代码。

id    | code    | used
1     | AAAAA   | 0
2     | BBBBB   | 0
3     | CCCCC   | 0
4     | DDDDD   | 0
5     | EEEEE   | 0

在单用户环境中,我会做

SELECT * FROM code_table WHERE used = 0 ORDER BY id ASC LIMIT 1

然后根据给定的ID,

UPDATE code_table SET used = 1 WHERE id = 1

在阅读了有关隔离级别的文档(相当新手)之后,我不确定了。

以正确的顺序同时进行会话的最安全,最有效的方法是什么,避免死锁等类似的问题,而死锁之类的问题会要求为会话设计多尝试解决方案以获取有效的代码。

我会天真地做以下事情:

SELECT * FROM code_table WHERE used = 0 ORDER BY id ASC LIMIT 1 FOR UPDATE
UPDATE code_table SET used = 1 WHERE id = 1

环境:

  • 适用于Linux x86_64的Mysql 5.7.26

0 个答案:

没有答案