假设我有一个名为tickets
的表,其中有4行,每行代表一个节目的票证(在这种情况下,这些是此节目可用的最后4张票)。
3个用户同时尝试购买,每个人都想购买2张门票,并且同时按下“购买”按钮。
是否足以通过TRANSACTION
处理每组2的分配,或者我是否需要在每个分配上明确调用LOCK TABLE
以防止分配2个故障单的可能性给两个用户。
希望他们中的一个人什么也得不到,并被告知系统错误地认为有可用的门票。
我对documentation感到困惑,因为我在启动TRANSACTION时会隐式释放LOCK,并且希望能够清楚地了解处理此问题的正确方法。
答案 0 :(得分:1)
如果您使用交易,MySQL会自动处理锁定。这是交易的全部要点 - 它们完全可以防止因重叠请求而造成的任何干扰。
答案 1 :(得分:1)
您可以使用"乐观锁定":将票证更新为已售出时,请确保包含票证仍可用的条件。然后检查更新是否失败(您获得更新的行数,可以是1或0)。
例如,而不是
UPDATE tickets SET sold_to = ? WHERE id = ?
DO
UPDATE tickets SET sold_to = ? WHERE id = ? AND sold_to IS NULL
这样,数据库将确保您不会收到相互冲突的更新。不需要显式锁定(正常的事务隔离就足够了)。
如果您有两张票,您仍然需要将两个调用包装成一个事务(如果其中任何一个失败,则回滚。