序列应该是线程安全的:
create table ORDERTEST (
ORDERID number not null ,
COLA varchar2(10) ,
INSERTDATE date default sysdate,
constraint ORDERTEST_pk primary key (orderid)
) ;
create sequence ORDERTEST_seq start with 1 nocycle nocache ;
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
select ORDERTEST_SEQ.NEXTVAL , substr(OBJECT_NAME,1,10), sysdate
from USER_OBJECTS
where rownum <= 5; --just to limit results
select *
from ORDERTEST
order by ORDERID desc ;
ORDERID COLA INSERTDATE
---------------------- ---------- -------------------------
5 C_COBJ# 16-JUL-10 12.15.36
4 UNDO$ 16-JUL-10 12.15.36
3 CON$ 16-JUL-10 12.15.36
2 I_USER1 16-JUL-10 12.15.36
1 ICOL$ 16-JUL-10 12.15.36
现在在另一个会话中:
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
select ORDERTEST_SEQ.NEXTVAL , substr(OBJECT_NAME,1,10), sysdate
from USER_OBJECTS
where rownum <= 5; --just to limit results
select *
from ORDERTEST
order by ORDERID desc ;
5 rows inserted
ORDERID COLA INSERTDATE
---------------------- ---------- -------------------------
10 C_COBJ# 16-JUL-10 12.17.23
9 UNDO$ 16-JUL-10 12.17.23
8 CON$ 16-JUL-10 12.17.23
7 I_USER1 16-JUL-10 12.17.23
6 ICOL$ 16-JUL-10 12.17.23
Oralce 序列是线程安全的:http:
//download.oracle.com/docs/cd/B19306_01/server.102/b14231/views.htm#ADMIN020
“如果两个用户同时访问相同的序列,那么每个用户的序列号用户接收到的可能有间隙,因为序列号也是由其他用户生成的。” 数字可能不是 1,2,3,4,5(如我的示例中 --> 如果你担心这个你可以缓存)
这也有帮助,尽管他们没有找到他们的来源:
http: //forums.oracle.com/forums/thread.jspa?threadID=910428
“无论您提交还是回滚事务,序列都会立即且永久地递增。对序列的 NextVal 的并发访问将始终向每个调用者返回单独的值。”
如果您担心插入会乱序并且您需要序列值,请使用返回子句:
declare
x number ;
begin
insert into ORDERTEST (ORDERID, COLA, INSERTDATE)
values( ORDERTEST_SEQ.NEXTVAL , 'abcd', sysdate)
returning orderid into x;
dbms_output.put_line(x);
end;
--11
然后你就知道它是在当时和那里插入的。