浏览 1902 次
锁定老帖子 主题:php同步方案1
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-06
最后修改:2011-10-06
=============================================================== 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这个文件,不希望在同一时刻被两个请求访问,可以: $db = getdb();// 获得数据库连接。 //这句话的意思是:第一个执行的程序立刻得到,而第二个执行的程序需要等到前一个也是对持文件的请求 //执行到release_lock的时候,才能获得结果,中间就一直阻塞着。但只阻塞10秒,不管有没有得到锁。 $result = $db->fetchOne("select get_locak('aa', 10)");// if (intval($result) == 0) { //这句话意思是:为了不让用户等太时间,10秒到了还没得到锁,给用户提示 echo "当前服务器忙,请重新再试"; exit; } //执行到这里是得到锁了,于是做一些操作,下面的这些语句不希望被并发。 语句1; 语句2; //这里结束了,释放锁 $db->query("do realease_locak('aa')");// //下面的语句不重要,所以可以在锁释放后执行,因为希望占用锁的时间尽可能短。 不重要语句1; 不重要语句2; 程序结束。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-06
最后修改:2011-10-06
语句1,语句2也可以是对数据库或文件之类的操作,实际上主要是对数据库的操作。
但是本方法只适用于重要操作速度很快的情况,不然服务器卡死了。 |
|
返回顶楼 | |