基本上,我有以下问题。有一个处理付款的订单处理系统。在极少数情况下,我们最终会收到双重订单,因为当我们通过 API 查询信用卡处理程序时,如果用户刷新页面非常快,信用卡处理程序有时会将这两个请求都响应为“成功”,我们得到两个成功系统中的“付费”事件。
所以我的想法是对支付的东西(每个订单)实施锁定,如果锁定被锁定,告诉客户关闭(如果客户很快刷新页面就会发生这种情况 - 我认为在我们的例子中它实际上是故意的) .
所以我想用 Redis 来做这件事并想出了这个:
def _PaymentInterlock(object):
def __init__(self, pp):
self.key = GlobalKey('pay_ilk_%s'%pp._ident)
def lock(self):
self.key(1)
def unlock(self):
self.key.delete()
def try_lock(self):
result = self.key()
if result == 1:
return False
self.lock()
return True
唯一的问题是try_lock操作不是原子的(与真正的比较和存储操作相反),所以从技术上讲,两个 WSGI 工作人员可能会丢失密钥,然后都锁定“锁”,从而导致相同类型的问题。
对我将如何解决此类问题有任何建议吗?