如何处理 MySQL 锁


How to handle MySQL locks?

我的要求是,用户可以点击并利用这笔交易。一个交易只能由一个成员使用,因此当用户尝试使用交易时,我会锁定表并解锁它。 因此,如果两个用户单击并尝试使用交易,它将形成一个队列,它将阻止两个用户利用该交易。

代码就像

LOCK TABLES deal WRITE;
//MySQL queries and my php code goes here.
UNLOCK TABLES;

现在的问题是,如果我的 php 代码在锁定和解锁之间出现问题怎么办,桌子会被永久锁定吗?无论如何,我可以设置锁定表的最长时间吗?

如果我在你的

位置上,我会创建一个名为 locked_deals 的数据库表。它将有一个名为 deal_id 的列。当用户选择交易时,其deal_id将入到locked_deals表中。当下一个用户点击相同的交易时,它将首先检查deal_id是否在锁定表中。如果是,它将不允许用户选择交易。最后,当一切正常时,我们可以在进程结束时从锁定表中删除lock_id。对于由于 php 代码中的任何异常而卡在表中的lock_ids - 我们可以创建一个后台服务,该服务每 n 分钟清理一次locked_deals表中卡住的 id(最近 n 分钟卡住)。希望对您有所帮助。

如果客户端会话的连接终止(无论是正常还是异常),服务器都会隐式释放会话持有的所有表锁。