免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1629 | 回复: 0
打印 上一主题 下一主题

php同步方案1 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-12 20:22 |只看该作者 |倒序浏览
php同步执行挺麻烦,根据mysql的文档,可以这样。


===============================================================
GET_LOCK(str,timeout)
设法使用字符串str 给定的名字得到一个锁, 超时为timeout 秒。若成功得到锁,则返回 1,若操作超时则返回0  (例如,由于另一个客户端已提前封锁了这个名字 ),若发生错误则返回NULL (诸如缺乏记忆或线程mysqladmin kill 被断开 )。假如你有一个用GET_LOCK()得到的锁,当你执行RELEASE_LOCK()或你的连接断开(正常或非正常)时,这个锁就会解除。

这个函数可用于执行应用程序锁或模拟记录锁定。名称被锁定在服务器范围内。假如一个名字已经被一个客户端封锁, GET_LOCK() 会封锁来自另一个客户端申请封锁同一个名字的任何请求。这使对一个封锁名达成协议的客户端使用这个名字合作执行建议锁。然而要知道它也允许不在一组合作客户端中的一个客户端封锁名字,不论是服役的还是非故意的,这样阻止任何合作中的客户端封锁这个名字。一个减少这种情况发生的办法就是使用数据库特定的或应用程序特定的封锁名。例如,  使用db_name.str或 app_name.str 形式的封锁名。


===============================================================

假如某个文件不希望被用户并发访问,只能依次访问,

假如a.php这个文件,不希望在同一时刻被两个请求访问,可以:


Java代码

  1. $db = getdb();// 获得数据库连接。

  2. //这句话的意思是:第一个执行的程序立刻得到,而第二个执行的程序需要等到前一个也是对持文件的请求
  3. //执行到release_lock的时候,才能获得结果,中间就一直阻塞着。但只阻塞10秒,不管有没有得到锁。
  4. $result = $db->fetchOne("select get_locak('aa', 10)");//
  5. if (intval($result) == 0) { //这句话意思是:为了不让用户等太时间,10秒到了还没得到锁,给用户提示
  6.    echo "当前服务器忙,请重新再试";
  7.     exit;

  8. }

  9. //执行到这里是得到锁了,于是做一些操作,下面的这些语句不希望被并发。
  10. 语句1;
  11. 语句2;

  12. //这里结束了,释放锁
  13. $db->query("do realease_locak('aa')");//

  14. //下面的语句不重要,所以可以在锁释放后执行,因为希望占用锁的时间尽可能短。

  15. 不重要语句1;
  16. 不重要语句2;

  17. 程序结束。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP