`
zhengdl126
  • 浏览: 2509728 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

并发同步

 
阅读更多



===================================1 同步方案一的方法是同步

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代码  收藏代码

    $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; 
     
    程序结束。 








========================================== 2 for update的方法是用innodb的行锁。


    $db = getdb(); 
    $db->query('SET AUTOCOMMIT=0'); 
    $db->query('START TRANSACTION');  
     
    $sql = " select id from air_ticket where isactive=1 and batch='today' for update";//查今天的有效飞机票,for update 是重点。 
    $result = $db->fetchOne($sql); //因为顾客只想买一张票 
    if ($result) { //还有票 
       $db->query("update air_ticket set isactive=0 where  batch='today' and id=". $result); //发了一张票 
    }  
    $db->query('COMMIT'); 
    $db->query('SET AUTOCOMMIT=1'); 
     
    if ($result) { 
      echo "您购买的机票id是".$result; 
    } else { 
       echo '对不起,机票已卖完'; 
    } 


======================================= 小结




如果操作机票表只有很少的几个文件,可以同步
如果操作机票表只有文件很多,同步不过来(因为那样系统太卡了),只能行锁。

如果写操作并发少,行锁,
写操作并发多,行锁会影响别的写操作,那么同步可以。
(针对这一点,如果用行锁,需要适当分表)

需要同步的代码很少,系统能很快执行完,优先同步,同步正确率应该高,理论上是这样。
反之只能行锁。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics