保护多个会话获取相同数据的正确方法是什么?

时间:2014-11-21 02:38:35

标签: mysql transactions locking

假设我有一个名为tickets的表,其中有4行,每行代表一个节目的票证(在这种情况下,这些是此节目可用的最后4张票)。

3个用户同时尝试购买,每个人都想购买2张门票,并且同时按下“购买”按钮。

是否足以通过TRANSACTION处理每组2的分配,或者我是否需要在每个分配上明确调用LOCK TABLE以防止分配2个故障单的可能性给两个用户。

希望他们中的一个人什么也得不到,并被告知系统错误地认为有可用的门票。

我对documentation感到困惑,因为我在启动TRANSACTION时会隐式释放LOCK,并且希望能够清楚地了解处理此问题的正确方法。

2 个答案:

答案 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

这样,数据库将确保您不会收到相互冲突的更新。不需要显式锁定(正常的事务隔离就足够了)。

如果您有两张票,您仍然需要将两个调用包装成一个事务(如果其中任何一个失败,则回滚。