场景:

利用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语句来插入记录,记录中的lastid为2(这时,表未锁)。

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了也利与多种数据库

1 楼

charles751

2009-03-06

这是真实项目中的应用吗?

2 楼

lwx_1987

2009-03-06

不是很懂!

3 楼

dolphin_ygj

2009-03-06

charles751 写道

这是真实项目中的应用吗?

是的

4 楼

movingboy

2009-03-07

其实这个完全可以再简化一些:

create or replace procedure get_sequence(key in varchar2) return number

ret_val sys_sequence.lastid%type;

begin

update sys_sequence

set lastid = lastid + 1

where code = key;

if sql%notfound then

insert into sys_sequence(code, lastid)

values (key, 1);

end if;

select lastid

into ret_val

where code = key;

return ret_val;

end;

/

我的异常网推荐解决方案:oracle存储过程,http://www.myexceptions.net/oracle-develop/177537.html

oracle 多线程调用过程,oracle 存储过程 多线程相关推荐

  1. oracle中调用过程,oracle中如何调用存储过程

    oracle中如何调用存储过程 发布时间:2020-03-08 03:28:03 来源:51CTO 阅读:511 作者:lxg290 一.通过pls块来调用存储过程: declare p_dzno v ...

  2. oracle包函数过程,oracle 函数,包,存储过程简单实例

    /* 存储过程 参数类型: in 表示入参 out 表示出参 in out 表示既是入参又是出参 默认情况下是入参 注意: 存储过程的参数数据类型不需要指定精度 */ create or replac ...

  3. oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用

    -- job begin sys.dbms_scheduler.create_job(job_name => 'SSS.P_TRMS_CAR_TASK_JOB', job_type => ...

  4. java多线程调用一个函数_Java 多线程(一)

    1. 多线程使用方法 使用多线程,绝大部分情况都是通过如下两种方式实现的,即继承Thread类或者实现Runnable接口.以下对两种方式分别进行介绍并比较. 1.1 使用Thread类实现多线程 自 ...

  5. Oracle 触发器调用存储过程|转||待研究|

    Oracle触发器调用存储过程资料收集整理 触发器:Trigger 存储过程:Stored Procedure // ******************** 收集1 **************** ...

  6. oracle入库的速度能到多少_多线程能提高Oracle的入库速度吗

    多线程能提高Oracle的入库速度吗 最近常常和同事们讨论"系统架构",其中有不免提到如何使用"多线程"来改善系统性能.有些同事普遍有一种"认为&qu ...

  7. 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案

    遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用 ...

  8. oracle ajax储存过程分页,创建 Oracle 分页存储过程

    1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结果集的指针.与普通的游标不同,REF CU ...

  9. oracle存储while用mysql_oracle存储过程while

    Oracle下我个人认为有些事情不一定用存储过程,但还是说一下 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN ...

最新文章

  1. php入门时间,php入门教程(二十一) php日期与时间函数
  2. Redis的入门(一)安装,设置密码
  3. 零基础带你学习MySQL—备份恢复数据库(三)
  4. 51Nod-1013 3的幂的和【快速模幂+逆元】
  5. @转载 ASP.NET跨页面传值技巧
  6. ActivityMQ安装部署
  7. 黑客帝国般的Linux屏保cmatrix的安装和使用
  8. 易地推拓客分享:内容获客是最稳定的获客方式之一
  9. 远程连接服务器出现channel is not opened通道未打开
  10. 自定义控件之下拉刷新列表
  11. c语言求最小公倍数_最小公倍数
  12. pip下载报错:pip._vendor.urllib3.exceptions.SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decry
  13. 关于excel导出日期格式变化问题处理
  14. 如何保证代码的健壮性和可读性
  15. 学习记录:Unity点击屏幕生成随机UI花朵
  16. Android S 新特性:应用行为更改
  17. C#,.net使用特性类,将json转为实体时验证字段
  18. 【k8s系列十二】k8s 之 Service的类型
  19. 多层嵌套json转换为Map再转换为单层
  20. 小哥哥,检索式chatbot了解一下?

热门文章

  1. epoll 编程注意事项以及参数查看
  2. 菜农“中国象棋数字编码”骗婚记
  3. 存储例题:2048*1024的32位全彩图像……
  4. 数据结构学习地址--上海交大acm试点班总教头俞勇老师讲的哦,还有其他课程地址,超全icourse
  5. 深度学习数据不均衡的处理方法
  6. win10开启护眼模式
  7. javaWeb实现空气质量的检测
  8. Android百度地图(三):百度地图画运动轨迹及图层点击事件处理
  9. Java mail接收邮件 回复邮件 转发邮件
  10. win2012 php5.2,windows2012core下php5.5兼容mssql数据库 (完美WASP环境搭建)