例如,假设您向几千名订户发送了简讯,并且您宣传“点击此链接的前100名可获得10%的折扣”。作为一个极端的例子,假设数千次点击在几秒钟内到达。有什么正确的方法来确保在100次点击事件被锁定之后,101或102个客户没有机会得到“恭喜获得折扣信息”实现PHP/MySQL交易锁定机制的正确方法
2
A
回答
4
您可以创建一个锁定文件和flock($fp, LOCK_EX)
它以确保只有一个(PHP)进程可以同时打开它。 成功锁定文件后,您处理该请求,并在完成时flock($fp, LOCK_UN)
它。
$fp
是由fopen()
返回的文件句柄。
当然,您也可以使用互斥锁,但它们在PHP中默认情况下未启用。
这里的一个流“表”羊群溶液:
- 打开锁文件(可以简单地一个空文件)
- 锁定该文件。如果另一个进程已经锁定它,这个调用将阻塞,直到另外一个锁释放
- 检查用户是否仍然有资格做任何他想做的事
- 如果是/否,做一些
- 解锁文件
- 关闭文件
3
具有这样你写的响应的表,你得到他们。然后很容易就可以检查一个特定的响应是否在前100个中 - 只要查看是否在前100行中按相应字段排序。
让MySQL为你做所有的锁定工作!
+0
自动增加PK +检查mysql_insert_id()<= 100是一个聪明而且非常简单的解决方案。 – 2011-02-10 22:45:04
0
你可以有一个BEFORE INSERT
触发,从另一个表Can you access the auto increment value in MySQL within one statement?和abort拉自动增量,如果它是大于100
相关问题
- 1. QueueUserWorkItem是否锁定正确实现?
- 2. 正确实现hashCode()方法
- 3. GSEventLockDevice无法正确锁定手机
- 4. Talend处理交易的正确方式
- 5. Rails 3 - 交易和锁定
- 6. 交易锁定SQL Server 2005
- 7. 努力正确实现自定义导轨控制器方法
- 8. 实现loadView的正确方法?
- 9. 实现继承的正确方法
- 10. Parcelable实现的正确方法
- 11. IDisposable - 正确的方法实现(c#)
- 12. 实现DAO类的正确方法?
- 13. 这是一个自定义锁定机制的好实现吗?
- 14. 确实getWritableDatabase()影响交易
- 15. 如何实现交易?
- 16. 交易已死锁
- 17. 锁定数据库中的交易
- 18. Django的交易中锁定表
- 19. 如何正确实现onDestroy方法?
- 20. 如何正确实现jQuery noConflict()方法?
- 21. 实体框架 - 通用交易方法
- 22. 如何实现锁定/解锁安卓手机的自定义方式
- 23. 交易锁的替代
- 24. 交易中的Postgres锁
- 25. 在ASP.NET中实现数据绑定的正确方法
- 26. T-SQL交易并锁定表
- 27. 高效交易,记录锁定
- 28. PDO,mysql,交易和表锁定
- 29. Hibernate和交易,并锁定表
- 30. 实现NUnit 2.5 Constraint.Write *()方法的正确方法是什么?
7.添加代码,这样,如果在步骤3或4的PHP崩溃了,你收拾锁。否则,没有人可以做任何事情。锁是困难的:-) – James 2011-02-10 22:46:26