不用序列,或者可以建立一个表A(type, maxid) 来存储这个max值, 然后每次需要插入一个id的时候,可以先去表A查询当前最大的max值并锁住这个最大值 ex: select maxid from A where type = xxx for update nowait ; 取得maxid 然后 maxid + 1 作为新的id 插入,同时更新表A中对应的maxid,最后一起提交如果并发操作的时候,先到达的请求会获得资源,插入数据;后到达的资源会因为所申请的资源被锁而获得一个资源正忙,请过会儿再申请的错误
我认为应该用序列,否则把问题复杂话了, 这个有点相当于MySQL的自增长方式create sequence RequestID increment by 1 start with 1 nocache;insert into A (ID, ...) values (RequestID.NextVal,...);这样不会受并发的影响.
查询时加(加了没用呀,查询出max时锁就释放了)?录入本来就有锁关注!
然后每次需要插入一个id的时候,可以先去表A查询当前最大的max值并锁住这个最大值
ex: select maxid from A where type = xxx for update nowait ;
取得maxid 然后 maxid + 1 作为新的id 插入,同时更新表A中对应的maxid,最后一起提交如果并发操作的时候,先到达的请求会获得资源,插入数据;后到达的资源会因为所申请的资源被锁而获得一个资源正忙,请过会儿再申请的错误
这个有点相当于MySQL的自增长方式create sequence RequestID
increment by 1
start with 1
nocache;insert into A (ID, ...) values (RequestID.NextVal,...);这样不会受并发的影响.
而,使用序列插入的时候,如果意外导致插入失败,当前表中的最大id 为5,而下一个插入的id 就不是6,而是7了(因为曾经插入失败,序列值已经自动加1)
所以考虑了一下,序列好像不能够满足楼主的要求
如果加锁了,查询不到结果的,返回个资源正忙,请过会儿再申请的错误
select id into intoid from tablename
where id=
(
select max(id) from tablename
) for update;
insert into tablename(id) values(intoid +1);