JDBC访问Oracle数据库,获得一个连接后,第一步:insert into mytable ( a ) values( my_seq.nextVal);第二步:select my_seq.curVal from dual,请问第二步取到的序列值一定是第一插入的值吗,如果在执行完第一步后另一个线程也进行了my_seq.nextVal的操作,此时序列被加1,再执行第二步时会不会取出多加了1的值

解决方案 »

  1.   

    不会影响。
    可以做个试验如下:
    1.在一个会话下
    sys@ORCL(192.168.21.110)> select sq_test1.nextval from dual;   NEXTVAL
    ----------
             2
    sys@ORCL(192.168.21.110)> select sq_test1.currval from dual;   CURRVAL
    ----------
             2这时的currval是22.再打开一个会话
    如果执行select sql_test1.currval from dual会报错
    sys@ORCL(192.168.21.110)> select sq_test1.currval from dual;
    select sq_test1.currval from dual
                                 *
    第 1 行出现错误:
    ORA-08002: 序列 SQ_TEST1.CURRVAL 尚未在此会话中定义然后再扫行
    sys@ORCL(192.168.21.110)> select sq_test1.nextval from dual;   NEXTVAL
    ----------
             3
    这时nextval=3然后回到第一个会话
    sys@ORCL(192.168.21.110)> select sq_test1.currval from dual;   CURRVAL
    ----------
             2
    sys@ORCL(192.168.21.110)> select sq_test1.nextval from dual;   NEXTVAL
    ----------
             4
    可以看到是2
      

  2.   

    当然会有问题,所以一般是用变量保存my_seq.nextVal ,然后再insert
      

  3.   

    my_seq.nextVal取一次my_seq.curVal 就增加一次
      

  4.   

    刚试了下,确实1楼是对的,另一个用户下取nextVal不影响当前用户的curVal,只是当前用户取nextVal会增加
      

  5.   

    在Oracle的默认隔离级别下:
    关键看另一个线程打开的Session和前面的线程是不是相同的
    如果不同,没有影响,如果相同,currval会跳,会变成后一个线程操作后的。