lz的问题应该没有那么复杂,做好数据库的事务处理就好了。如果用Mysql的话,桌面引擎使用InnoDB,
搜索的时候用select update语法,
这样的话,一直到下次rollback/commit,
数据一直都会被锁住。
多少个线程都无所谓。

解决方案 »

  1.   

    N个线程通过1个入口访问一个持续的数据。转发给别的合作方是什么意思?
    唯一约束是什么?这不是典型的transaction processing?
      

  2.   


    那个问题我已经通过将不希望重复的字段增加UNIQUE解决了。转发给别的合作方的意思就是,你通过http协议,带一些参数,访问我的接口,我收到后,还要再去请求其他合作方,把这些参数通过http协议传给他们。现在数据库可以避免插入重复数据了,但我的php程序不会exit(),因为无法通过什么方法来告诉程序该exit了()。我希望当数据库中有重复数据的时候,程序也能exit(),事务处理也跟唯一约束在这里的作用一样,只能避免重复数据插入,并不能让程序也exit()。目前这似乎没什么别的办法。我很多合作方也遇到这个问题没法解决,幸亏我们的数据并不要求非常精确。
      

  3.   

    你:
    通过http请求,带了3个参数,arg1,arg2,arg3
    ->
    我:
    1 接收$_REQUEST['arg1'],$_REQUEST['arg2'],$_REQUEST['arg3'];
    2 插入数据库,如果arg2在数据库中存在,exit(),否则插入。
    ...
    last 通过http请求将arg1,arg2,arg3其他合作方接口
    ->
    他:
    ...
    我现在最大的问题是在我那里第2步的时候,程序不能够停下来,还会继续下面的步骤。对方单线程发包的话,先用arg2在数据库中查询,返回数量>0,就exit()。如果多线程并且发包密集的话,程序滤重将会失效,这时可以利用唯一约束或事务处理。使用UNIQUE和Transactions Processing能保证数据库插入的值唯一,但是不能让程序停止下来。而且,我的表已经有了N多数据,这些表类型都是myisam,如果将数据库引擎更改为innodb不得不说实在有点
    这些数据还要经常做查询,我们对实时数据也是要求很高的,myisam在查询检索方面要强于innodb。
      

  4.   

    如果用myisam,可以使用程序锁$overtime=5;//超时时间
    $lockStr=$_REQUEST['arg2'];//需要锁定得关键值
    $query="select GET_LOCK($lockStr,$overtime) ";//锁定
    $res = @mysql_query($query);//为true,成功锁定/*
    干一些事,比如查询 $_REQUEST['arg2'] 是否存在 
    $query="select * from tableName WHERE fieldName='".$lockStr.'";
    mysql_query($query);在这段时间中,如果还有其他进程,使用一样的关键值的 sql操作,将被阻塞,直到本进程解锁
    当然在这里,你在一开始的时候,就可以使用 IS_FREE_LOCK /IS_USED_LOCK 来判断关键值 的锁当前是否被占用,是的话就可以退出了。具体手册上有
    */$query="select RELEASE_LOCK($lockStr) ";//解锁
    $res = @mysql_query($query);
      

  5.   

    可能是我到现在还不太清楚到底要做什么。
    看lz的一些做法很反常规。MyISAM桌面引擎只适合于没有复杂事务处理的web程序。
    如果有复杂事务处理的系统,MyISAM桌面引擎,无法保证数据的一贯性。
    锁表的话,效率更低。
    数据库事务处理的控制在AP服务器实现是不现实的,几乎相当于开发1/3个RDB,而且用PHP似乎无法实现。myisam在查询检索方面要强于innodb,但是具体强多少,做过性能测试吗?
    速度不代表一切,连系统数据的质量都保证不了的话,再快有什么用?
    如果像lz所说,对数据要求较高,为什么不考虑数据库或者数据的多重化?其他的不说,web开发中以下这两条是想都不需要想的
    1 升级服务器 
     如果google找lz开发个小程序,还要附带升级上万台服务器吗?
     ——Google半个月的收支都要赤字的话,够上头条的了。
    5 要求所有合作方采用单线程方式 
     10客户*1线程5客户*2线程有本质区别吗?
     web程序的前提就是多线程,如果真的只有一个线程,应该有比web更好的选择。
     RDB提供了在多用户系统中,对单一的永持续的数据进行操作的大多数功能并将他们封装,不要让他们闲着。
      

  6.   

    1。用affected_rows判断实际插入是否成功,失败就退出不就行了吗?2。使用事务处理是更好的方法,
       innodb的速度问题没有那么严重,
       你自己可以测试一下