如何防止多个Web请求处理相同的记录?

时间:2009-10-07 19:15:01

标签: php mysql sql-server

假设你有一张桌子上有一些中奖号码。这些数字中的任何一个都只是由一个人“赢得”。

我怎样才能阻止2个同时提交相同号码的网络请求同时检查并看到这些号码仍然可用,然后在号码被标记为不再可用之前将奖励提供给他们两个。

this question中的获胜解决方案与我的想法一样,因为它也可以应用于大多数数据库平台。

是否还有其他常用模式可以应用于此?

3 个答案:

答案 0 :(得分:6)

这些数字是随机生成的还是什么?

我会依赖数据库本身的事务语义:创建一个包含两列,数字和声明的表,并使用单个更新:

UPDATE winners SET claimed=1 WHERE claimed=0 AND number=@num;

然后检查受影响的行数。

答案 1 :(得分:1)

使用交易。如果没有事务锁定,任何体面的数据库都支持当前的事务,您永远不应该让多个线程或进程更改相同的数据。启动事务,“获取”中奖号码,然后提交。另一个线程将被锁定,直到提交,并且只有在记录更新后才有机会,当它可以看到它已经存在时。

答案 2 :(得分:0)

非数据库解决方案可能是让客户端将请求设置为异步,然后将请求推送到FIFO队列以控制请求,以便一次只评估一个请求。然后在评估完成后回复客户端。这里的优点是在高负载下,UI不会被冻结在数据库级别的事务锁定位置。