JDBC访问Oracle数据库,获得一个连接后,第一步:insert into mytable ( a ) values( my_seq.nextVal);第二步:select my_seq.curVal from dual,请问第二步取到的序列值一定是第一插入的值吗,如果在执行完第一步后另一个线程也进行了my_seq.nextVal的操作,此时序列被加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
关键看另一个线程打开的Session和前面的线程是不是相同的
如果不同,没有影响,如果相同,currval会跳,会变成后一个线程操作后的。