在多用户并发增加序列值的情况下,通过select seq.currentvalue from dual得到的是当前用户的增加后的序列值吗
我有一个序列,假设名为SEQ。我把它的值通过一个插入记录的触发器作为一个表的主键的值。
我想在插入记录后,得到这个主键的值,通过以下语句:
select seq.currentvalue from dual
问题是我的客户端比较多,可能客户端A插入一条记录时,主键值(即触发器的当前值)是n1,同时客户端B也插入一记录,主键是n2。那么A随后通过DUAL得到的触发器的当前值会不会是n2,而不是我希望的n1呢?
问题点数:100、回复次数:8Top
1 楼railgunman(堕落男人)回复于 2005-05-15 09:00:59 得分 30
这样处理:
一个客户端插入以后,马上就获取主键的值:
insert into tableA(F_A,F_B,F_C)
values(V_A,V_B,V_C)
returning KeyField
into :KeyField;Top
2 楼dacong(大聪)回复于 2005-05-15 12:26:39 得分 20
不用触发器,就在应用中写Top
3 楼horris(僧推月下门)回复于 2005-05-16 14:12:51 得分 0
to railgunman(堕落男人) :
我在客户端用ADO编程,请问你给的语句能用吗?
是否可以这样写:
select seq.nextvalue into kid from dual
insert into xxx (...) values (kid,...)Top
4 楼zsfww1205(努力学习oracle)回复于 2005-05-16 14:38:50 得分 20
直接用:
insert into xxx (id,..) values (seq.nextvalue,...)就可以了Top
5 楼zsfww1205(努力学习oracle)回复于 2005-05-16 14:40:59 得分 0
哦,应该是:seq.nextvalTop
6 楼horris(僧推月下门)回复于 2005-05-16 15:28:36 得分 0
楼上的,我的客户端还想知道刚刚插入的那个记录的ID的值。Top
7 楼rolandzhang()回复于 2005-05-17 17:11:06 得分 30
sequence 取值是连续的,但是在多用户并发的时候,由于某个客户端失败或者其他原因,并且sequence.nextval一旦产生,不能重用,会导致主键ID不连续,如果想保持主键不跳号,通过前端编程实现:比如每次取出最大的主键值+1作为下一个主键值Top
8 楼horris(僧推月下门)回复于 2005-05-17 17:21:21 得分 0
算了,不问了,我用自已的解决方案吧。谢谢各位参与Top




