MYSQL数据库下,当用户想添加记录到A表时,想先从A表查询当前最大的字段如ID,等等,+1后存入新记录,问题是多用户同时的时候,会出现同时读取当时最大ID为5,+1后都为6。如何解决这种问题,是锁表还是怎么样,不要自增不要自增,因为不是ID,只是某一列, 求大佬教下,新手不太懂。希望大佬能说的详细点~最好能贴个代码之类的  

解决方案 »

  1.   

    可以使用redis事务的WATCH监听,如果事务监听的同时其他人也在修改此记录则被打断
    当你更新的时候把此条记录放到redis去更新,配合事务监听
      

  2.   

    脏读啊?可以redis队列解决,也可以使用乐关锁解决,具体操作为:查询到ID字段当前的最大值之后保存到变量$ver,插入新记录的时候如果 'update A set ID = ' . $ver +1 . ', ID =  ' . $ver + 1 . 'where ID = ' . $ver;这个条件如果为真则插入成功,否则提示系统繁忙这么一个思路
      

  3.   


    也可以,看平时并发量,我自己觉得锁表会从查询到更新才释放锁,是会有点影响效率,如果并发量很大的话可以尝试用redis监听,都可以去改谁先修改谁正确,事务打断重新修改,如果并发量很大可能要考虑阻塞的情况,如果你们业务量不大我觉得锁表就够了