Oracle自定义序列号生成时的并发操作问题
某流水帐表序列号生成时带有一定规则,如:四位的年份+4位数字的序号20120001,20120002,...
我是每次查询该表取最大值,然后+1,一般来说没有什么问题,可是一旦多人同时并发操作时,例如也许有两个人查询表时,表中最大序号都为20120002,那么下一个最大值都会插入20120003的情况,即有可能得到的流水帐号相同,如何解决这种并发操作而不重号问题?

解决方案 »

  1.   

    -- Create sequence 
    create sequence SEQ_XXX
    minvalue 20120001
    maxvalue 999999999999
    start with 20120001
    increment by 1
    nocache;
      

  2.   

    我早就想过用序列不能解决我的问题,原因有,他是随着年份的变化而变化的,即每年开始的都是从201X00001开始的,表结构是这样的:
    部门      序号
    A        201200001
    B        201200001
    ...      ....
    所以不可能每个部门都建一个sequence吧?
      

  3.   

    你可以用锁把它lock住啊当你在这张表的时候,锁住,你用完之后释放
      

  4.   

    begin trans;
    select 序号 from 表 where 部门 = 'A' for update;
    execute your othe query;
    update 表 set 序号 = <new value> where ...;
    commit;
      

  5.   

    rownum+1也行
    序列也行,不过在事务失败时会跳号
      

  6.   

    顺便问一下,如果在未commit;前出现网络故障,那么它不是一直处于lock状态吗,怎么解决这种可能情况呢?