Dud*_*ude 6 mysql locking update
我有一张桌子叫做座位,它有这样的架构
身份证号
对于每个用户,我取一个随机未使用的 id 并分配给该用户,这里为简单起见,我使已使用 =1。我正在使用的查询
update seats u inner join (
SELECT id from seats
where taken is null limit 1) s
on s.id = u.id set taken = 1;
Run Code Online (Sandbox Code Playgroud)
此查询随机获取一个带有标记为空的席位,对于该席位,它使标志为 1。虽然此查询工作正常,但此线程安全吗?
考虑这种情况,我有两个并行的用户。对于 user1,我选择第 X 行,就在运行更新查询之前,user2 签入,对于该用户,select 查询返回与 user1 相同的行。所以我将结束两次更新同一行。
此查询是否可能出现这种情况?
如果你使用InnoDB,你可以用SELECT ... FOR UPDATE
一句话来保护你的交易
http://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
这样,您可以在事务未完成时对该行执行排它锁。其他会话将等待行锁被释放。