Oracle skip locked的应用

    开发提了一个需求,就是取合同编码,原先是通过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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值