我有一个凭证管理系统。我在这个系统上也有一个活动,先点击先得到订单。活动开始的头几分钟,很多人都想要优惠券。每次当他们尝试这样做的时候,同样的机制在设计图像上起作用。
在给定凭证的更新数量时,我意识到一个瓶颈。所有这些更新都试图在有限的时间内更新同一行。因此,事务添加队列并等待当前更新。
活动结束后,我看到一些更新等待了10秒。我怎么解决这个问题?
首先,我尽量减少查询的执行时间,但它已经是一个简单的查询。
假设每个人都在做这样的事情:
SELECT ..
FROM voucher_table
WHERE <criteria indicating the first order>
FOR UPDATE
那么显然每个人(除了一个人)都会排队直到第一个人提交。实际上,你最终会得到一个单用户系统。
您可以检查SKIP LOCKED子句,该子句允许进程尝试锁定符合条件的行,但如果第一行被锁定,则仍然跳过它到下一个符合条件的行。