此更新,选择组合查询线程安全吗?

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 相同的行。所以我将结束两次更新同一行。

此查询是否可能出现这种情况?

veg*_*ipy 0

如果你使用InnoDB,你可以用SELECT ... FOR UPDATE一句话来保护你的交易

http://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

这样,您可以在事务未完成时对该行执行排它锁。其他会话将等待行锁被释放。