用innodb格式,然后可以用事务处理

解决方案 »

  1.   

    function order_LOCK() {  //加锁相关表
    global $tabname;
    $sql = "LOCK TABLES {$tabname['order']}  WRITE, {$tabname['user']}  WRITE , {$tabname['card']} WRITE ,  {$tabname['cardlog']}  WRITE, {$tabname['goods']} READ"; 
    @mysql_query("$sql");
    }
    function order_UNLOCK() { //全部解锁
    $sql = "UNLOCK TABLES";
    @mysql_query("$sql");
    }
      

  2.   

    mysql支持行级锁吗,如果按scsjs(闪电回归) 的方法是不是整个order表都锁定了,那其他人不是都不能操作了,
    请问gu1dai(异域苍穹......追夢人) ,为什么需要新建一个状态表,我并不是很明白,如何用程序控制!
    请问 syre(神仙) ,如果用事务处理该怎么写?
    谢谢各位!
      

  3.   

    mysql 5 是不是支持行锁定啦?
      

  4.   

    在表里增加一个字段 修改时间 updatetime
    在session中记录打开编辑页面的时间 opentime具体流程如下:时间  A用户        B用户        A的session         B的session         数据库
    7:00  开始编辑                  opentime=7:00     
    7:01              开始编辑                          opentime=7:01  
    7:02  保存结果                                                         updatetime=7:02
    7:03              试图保存结果,检查发现updatetime>b的opentime,
                      提示记录已被修改,是否强行保存或者取回新的记录
      

  5.   


    咳咳,上面的表格乱了,时间 A用户 ----B用户 ----A的session ----B的session -----数据库
    7:00 开始编辑 ---------opentime=7:00
    7:01 ------开始编辑 -------------opentime=7:01
    7:02 保存结果 ---------------------------updatetime=7:02
    7:03 ------试图保存结果,检查发现updatetime>b的opentime,
    ---------提示记录已被修改,是否强行保存或者取回新的记录
    编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混上面的方法也可以更仔细一点,比如检查一下那些内容被修改了,一起提示给B用户
      

  6.   

    锁表,锁记录都是在确认对表修改之后实施的,
    楼主的问题是用户进入修改页面之后的状态就难以确定了,
    可能他打开页面一个小时后才修改,也可能就不修改了,
    所以锁的动作只能发生在提交save后,但这个时候往往需要
    执行的只有一个update或几个update/insert, 这个时候
    可以使用事务保证数据的一致。楼主关心的不是这个部分,
    而是两人或数人先后打开,后保存的人可能面对的是“脏数据”的问题。
      

  7.   

    re helloyou0(你好!) 
    编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混
    -------------------------------------------------------------
    当页面onload的时候,PHP程序已经执行完毕了,这时,所有数据锁自动解锁
    尽量减少锁定表操作中的代码。一般来说程序花不了几秒的时候。PHP程序执行完 MYSQL就自动解锁了,不会存在什么上床睡觉的问题。PS:使用mysql用事务回滚会很痛苦的说。
      

  8.   

    xuzuning(唠叨) 说的没有错。这个订单打开后,别的人就不可以操作了,如果他处理完订单,就不在出现在这个订单列表中,如果打开后,不操作,关闭后,其他人就可以操作订单,我要解决的就是,在某一个人打开这个订单后,别人就无法在打开他
      

  9.   

    好像都没看明白我说的,再解释一下:)数据库数据 为 比如 0,
    7:01    A用户打开编辑处理页面,他看到的值为0,
    7:02    B用户打开编辑处理页面,他看到的值也为0
    7:03    A用户决定修改值为10, 然后保存,数据库值变为10,
    7:04    此时B用户看到的值还是0,因为他没有刷新,数据依旧为旧值
            如果B用户此时修改值,并保存,他是在错误的基础上作的更改
            这是应该避免的情况。
    在上面的情况中,如果A用户保存后不设置任何标志
    B用户保存时,将无法检测到数据库的更改,从而导致B用户的修改将覆盖A用户的更改。如果使用锁,只能在保存时加锁,但是在上面的流程里,加锁对该流程无任何影响。如果“在某一个人打开这个订单后,别人就无法在打开他”,
    如果A用户打开后非正常结束呢?或者长时间未保存呢?然后再回头看上面的处理方式,应该可行吧
      

  10.   

    1、定单是有唯一编号的,由定单生成时产生。不可能出现编号相同的定单,也就不可能两个及以上的人填写同一张定单
    2、由于某种原因用户中断了定单的填写将出现空白定单,在通常情况下该定单号将被废止不再使用
    3、如果希望启用被跳过的空白定单(楼主的意思就在这里)。需要经过以下过程
    a、列出可用的定单号共用户选择
    b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的
    c、对该定单号设置已用标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选
    d、输出定单供用户填写
    e、用户确认已填定单后结束
    f、用户放弃定单的填写时,对该定单号设置未用标志
    这个过程是很费时的,要是我就不会选择定单填写而直接填写新定单。我也没有义务为你节省那点数据库空间
      

  11.   

    谢谢xuzuning(唠叨) ,不过你想错了,我要处理的是已经生成的订单,并不是订单生成的过程,helloyou0(你好!) 的方法和我现在的方法类似,不过我的方法有不足的地方,我是加了个字段表示是否此记录被打开,0是未打开,1是打开,每个人打开订单是会检查这个值,如果是1就不能打开了,但是在实际应用中还是会出现同时打开的现象,而且无法解决A用户打开后非正常结束的情况!
    如果用时间来作标示不知能解决这个问题吗?
      

  12.   

    再不你结合时间和标志位。
    当B试图打开时如果标志位为已打开,提示是否强行打开。
    (因为A用户如果非正常结束,会导致标志位锁死)“但是在实际应用中还是会出现同时打开的现象”
    这个应该能避免,检查你的update状态位的sql语句是否在合适的地方。---
    如果要再复杂一点,可以用ajax定期发信号到服务器保持状态位,一段时间无信号,就认为
    已经非正常退出,恢复标志位。时间的长短要掌握好。
      

  13.   

    xuzuning(唠叨)你误会了,下订单的是客人,而我这边要操作订单是公司内部员工,而且这个订单和普通商品的订单还不同,公司要审核订单内信息
      

  14.   

    学习,mysql怎样锁表锁记录啊
      

  15.   

    还是呀!这个过程还是跟我上面提到的操作空定单的过程基本一致的
    a、列出未处理的定单号供选择
    b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的
    c、对该定单号设置已审核标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选
    d、输出定单供审核
    e、确认已审核定单后结束
    f、放弃定单的审核时,对该定单号设置未审核标志解决A用户打开后非正常结束的情况
    需要有特权用户进行
    或者由复审员进行