利用oracle的存储过程实现在sys_sequence表中的多个的自动增长ID的多线程同步解决方案...

利用oracle的存储过程实现sys_sequence表的自动增长ID的多线程同步解决方案

 

sys_sequence表结构

sys_sequence表中的记录

 

 

DECLARE

               no NUMBER(10);

               key VARCHAR(50);

            begin

             key := ?;

             begin select lastid into no  from sys_sequence where code = key for update;

                   // 首先从sys_sequence找到相应表的lastid值,并使用for update后缀来锁住该记录。

             exception when no_data_found then no := 1;

                   // 截获no_data_found错误,当sys_sequence表中无记录时,lastid默认为1

             end;            

             if no>1 then

                update sys_sequence set lastid=no+1 where code=key;

                  // lastid大于1即表中存在记录时,使用update语句来更新该记录。

             else

                begin

                insert into sys_sequence (code,lastid) values(key,2);

                   // lastid==1时,即表中不存在记录,使用insert语句来插入记录,记录中的lastid2(这时,表未锁)。

                exception when DUP_VAL_ON_INDEX then

                  // 所以当有另外一个线程同步访问该表,并插入了code值相同的记录,oracle就会抛出DUP_VAL_ON_INDEX异常,意味着表中已经记录,不能使用insert语句。

                   select lastid into no  from sys_sequence where code = key for update;

                  // 重新查询表,获取lastid,并使用for update来锁记录

                   update sys_sequence set lastid=no+1 where code=key;

                  // 放心使用update语句来更新记录,这时已获得记录锁,无需担心同步问题。

                end;

             end if;

            ?:=no;

            end;;

 

可以少见几个oracle的sequence了也利与多种数据库

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值