假设你有一张桌子上有一些中奖号码。这些数字中的任何一个都只是由一个人“赢得”。
我怎样才能阻止2个同时提交相同号码的网络请求同时检查并看到这些号码仍然可用,然后在号码被标记为不再可用之前将奖励提供给他们两个。
this question中的获胜解决方案与我的想法一样,因为它也可以应用于大多数数据库平台。
是否还有其他常用模式可以应用于此?
答案 0 :(得分:6)
这些数字是随机生成的还是什么?
我会依赖数据库本身的事务语义:创建一个包含两列,数字和声明的表,并使用单个更新:
UPDATE winners SET claimed=1 WHERE claimed=0 AND number=@num;
然后检查受影响的行数。
答案 1 :(得分:1)
使用交易。如果没有事务锁定,任何体面的数据库都支持当前的事务,您永远不应该让多个线程或进程更改相同的数据。启动事务,“获取”中奖号码,然后提交。另一个线程将被锁定,直到提交,并且只有在记录更新后才有机会,当它可以看到它已经存在时。
答案 2 :(得分:0)
非数据库解决方案可能是让客户端将请求设置为异步,然后将请求推送到FIFO队列以控制请求,以便一次只评估一个请求。然后在评估完成后回复客户端。这里的优点是在高负载下,UI不会被冻结在数据库级别的事务锁定位置。