在插入结果前重新生成MAX好了!~

解决方案 »

  1.   

    表级锁加在什么地方?
    查询时加(加了没用呀,查询出max时锁就释放了)?录入本来就有锁关注!
      

  2.   

    不用序列,或者可以建立一个表A(type, maxid) 来存储这个max值,
    然后每次需要插入一个id的时候,可以先去表A查询当前最大的max值并锁住这个最大值
    ex: select maxid from A where type = xxx for update nowait ;
    取得maxid 然后 maxid + 1 作为新的id 插入,同时更新表A中对应的maxid,最后一起提交如果并发操作的时候,先到达的请求会获得资源,插入数据;后到达的资源会因为所申请的资源被锁而获得一个资源正忙,请过会儿再申请的错误
      

  3.   

    我认为应该用序列,否则把问题复杂话了,
    这个有点相当于MySQL的自增长方式create sequence RequestID
       increment by 1
       start with 1
       nocache;insert into A (ID, ...) values (RequestID.NextVal,...);这样不会受并发的影响.
      

  4.   

    嗬嗬,当然,使用序列是很好的方法,但是楼主要求的是插入记录的id值为表中记录max(id)+1
    而,使用序列插入的时候,如果意外导致插入失败,当前表中的最大id 为5,而下一个插入的id 就不是6,而是7了(因为曾经插入失败,序列值已经自动加1) 
    所以考虑了一下,序列好像不能够满足楼主的要求
      

  5.   

    select maxid from A where type = xxx for update nowait ;
    如果加锁了,查询不到结果的,返回个资源正忙,请过会儿再申请的错误
      

  6.   

    楼主可以尝试在两个session里面,都执行select maxid from A where type = xxx for update nowait ;其中一个能够成功加锁,另外一个就会返回错误的
      

  7.   

    lock table in exclusive mode
      

  8.   

    用这种方法行的:
    select id into intoid from tablename
    where id=
    (
      select max(id) from tablename 
    ) for update;
    insert into tablename(id) values(intoid +1);
      

  9.   

    用sequence就可以解决了,insert的时候使用sequence.nextvalue作为id号。
      

  10.   

    在for update时对表中的符合条件的行加了排它锁,其它session不可以必须等待