开发提了一个需求,就是取合同编码,原先是通过webserver去取,但有时候有性能问题,导致批量处理合同的时候有性能问题。现在要改造成先批量取一批合同编码放在本地。现在遇到的问题是怎么在并发情况下保证取的是不同的合同编码。数据库的skip locked可以解决。
1.通过webservice取1000个编号写到本地表中,表中应该有个标志表示是否使用。
2.当程序获取表示未使用的合同编号,select * from t where statut='未使用',假设能取到500条记录,那我循环去取编码select * from t where 编码='001' for update skip locked,如果有记录就说明是可以用的,如果没有记录,说明合同编码被其他人取了,再次循环。如果循环了所有的数据都没有取到,那就去用webservice去取。
3.写一个定时任务,1个小时执行一次,如果编码表里面少于1000个可用的编码,则调用webservice去取。
下面是skip locked的实验:
drop table t;
create table t(a number);insert into t values(1);
insert into t values(2);
insert into t values(3);
insert into t values(4);
insert into t values(5);
commit;
session1:
sql> select * from t where A in(1,2) for update skip locked;
A
----------
1
2
session2: sql> select * from t where A in(1,2) for update skip locked; 未选定行 sql> select * from t for update skip locked; A ---------- 3 4 5