我试图完成的事情看起来很简单,
数据库类型: MyISAM
表结构: card_id,status
查询:从表中选择一个未使用的card_id,并将该行设置为已使用。
当两个查询同时运行时,在状态更新之前,相同的card_id会被获取两次,这是竞争条件吗?
我已经搜索过了。看起来Lock table是一个解决方案,但它对我来说太过分了,需要Lock特权。
有什么想法吗?
谢谢!
发布于 2012-12-21 23:50:40
在我发布了这个问题之后,我想到了一个解决方案,这个方案和你在最后提到的完全一样。我使用了update语句,它是"update TABLE set status =' used‘where status = 'unused’limit 1",它返回表的主Id,然后我可以使用这个主ID来获取cart_id。说有两个update语句同时发生,正如您所说的,"MySQL将在整个表上获得一个锁,因此在那里的两个会话之间不存在“竞争”条件“,所以这应该解决了我的问题。但是我不确定你为什么说,"MySQL不提供样式声明支持“。
https://stackoverflow.com/questions/13980443
复制相似问题