逻辑是:
查询表A,看是否符合条件
符合条件,执行正常逻辑,把表A的条件修改成否现在遇到的问题是,表A的条件修改还没执行完,下一条语句又来了,导致执行了N次正常逻辑
这个地方该怎么控制呢?比如说csdn的这个每天登陆一次送可用分,应该是查询一个最好活跃时间,如果最后活跃时间不是今天,说明是第一次登陆,送分,然后更改活跃时间如果页面刷新足够快,还没有执行完更改活跃时间又刷新了一下,导致送了两次分,在非InnoDB的结构中怎么实现控制

解决方案 »

  1.   

    没遇到过这样的情况,自己写的程序也没出现过这样的情况。可以用相应的脚本限制刷新和短时间内重复查询。还有,你举的例子中送分和更新最后登录时间可以是同一时间进行的(更新一个表中的数据)。如果是两条sql查询,那几乎也是同一时间进行的,又怎么会反复执行呢。第二次判断的时候就不会送了
      

  2.   

    用行锁,锁定记录,就可以先 select * from table for update然后再使用update注意这两个操作要放在事务中
      

  3.   

    这个问题跟事务处理没有关系,也就是说,换成InnoDB也解决不了你的问题。此问题应归属于重复更新问题,例如,注册用户的时候,insert语句在“注册完成画面”执行的情况。
    一次注册完成,在“注册完成画面”刷新浏览器,只是相同用户信息重复注册的漏洞,这都是相近的问题。-治标的解决方法:
     链接或者按钮使用JavaScript控制,默认状态下有效,如果被按下一次就让其失效。
    此方法实现起来比较方便,缺点是治标不治本。不过,对于大多数网站已经够用了。-治本的解决方法:
     1.在form中镶入hidden的标示字串,在同一session内,做过更新处理之后,更换此字串。
     2.更新处理时,客户端发送的标示字串跟session内保存的字串不同,就禁止处理,相同则允许处理。
    此方法如果没有框架支持,实现成本比较高,但是最根本的解决办法。
      

  4.   

    这种情况应该很少出现吧,不过可以设置个session变量来表示状态,
    在查询之前设置状态为1,查询之后,更新可用分或其它操作完成再把状态设为0
    如果状态为1时再刷新,就提示系统忙