lock table 效率下降的很大啊!

解决方案 »

  1.   

    那就不用lock table,可以用一个文件X解决。
    进程A->检查X->不存在X->创建X->读取数据->处理数据->存入数据->删除X
    进程B->检查X->存在X->等待->不存在X->创建X->读取数据->处理数据->存入数据->删除X
    这样可以不用lock table,其他无关进程仍然可以运作。
      

  2.   

    nethermit(网络隐士)说的是个好办法.
    如果php提供了在内存里lock的方法就好了,不知道有没有.
      

  3.   

    是的,如果考虑到并发的情况,加上网络速度的延迟,会造成系统资源的大量浪费,
    一般情况下,select操作是不会锁表的,而update 和 delete 考虑到数据的一致性,数据库系统就会进行lock操作,如果长时间没有解锁操作,如
    update 后没有及时commit,这条记录就一直处在lock状态,想对这条记录再进行其他操作,就会进行等待状态,一直都没响应。跟据我个人的经验,一般对表的insert ,update ,delete 操作,一般不要放在PHP程序中进行,而放在数据库服务器进行,实现方法是用PHP调用存储过程,一是运行效率高,二是可以对部分的数据库操作流程封包,简化程序,三是由于在数据库服务器运行存储过程,及时使用commit,一般不会出现由于锁而无响应状态
    一家之言,可能部分数据库有适用
      

  4.   

    对了,看了楼上的那个A,B进程的办法,
    用存储过程就是把读取数据,处理数据,写入数据的这个流程封包
    用PHP调用一次就可,一定程度上可以简化PHP程序存储过程支持参数的传入,传出,不过不支持数据集
      

  5.   

    A,B进程在实操的时候有可能出现一次数据处理后,文件删除失败,造成所有进程SLEEP,还要加守护进程查看文件时间戳,以避免这样的情形发生
      

  6.   

    回复:genbin(蓝丐) 有些時候要和前臺用戶進行交互的,存儲過程不一定能有用。
    呵呵,本來我也想說存儲過程的,看看他的意思好像不能用。
      

  7.   

    回复:genbin(蓝丐) 有些時候要和前臺用戶進行交互的,存儲過程不一定能有用。
    呵呵,本來我也想說存儲過程的,看看他的意思好像不能用。
      

  8.   

    前台用户对数据库的操作是经过PHP程序的,
    数据的加工可以在前台和PHP进行,加工完后,如更新,添加等对数据库的操作就可由存储过程来做对了还有个办法,就是采用多层结构的数据库系统,
    对事务的管理,由中间层来进行,PHP只负责传数据,与数据库操作无关
      

  9.   

    但话又说回来,PHP对多层数据库的开发支持不是很强
    我已转用Jsp
      

  10.   

    你们用什么数据库啊,MYSQL不支持COMMIT,ROLLBACK的