oracle 多线程调用过程,oracle 存储过程 多线程
场景:
利用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 存储过程 多线程相关推荐
- oracle中调用过程,oracle中如何调用存储过程
oracle中如何调用存储过程 发布时间:2020-03-08 03:28:03 来源:51CTO 阅读:511 作者:lxg290 一.通过pls块来调用存储过程: declare p_dzno v ...
- oracle包函数过程,oracle 函数,包,存储过程简单实例
/* 存储过程 参数类型: in 表示入参 out 表示出参 in out 表示既是入参又是出参 默认情况下是入参 注意: 存储过程的参数数据类型不需要指定精度 */ create or replac ...
- oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
-- job begin sys.dbms_scheduler.create_job(job_name => 'SSS.P_TRMS_CAR_TASK_JOB', job_type => ...
- java多线程调用一个函数_Java 多线程(一)
1. 多线程使用方法 使用多线程,绝大部分情况都是通过如下两种方式实现的,即继承Thread类或者实现Runnable接口.以下对两种方式分别进行介绍并比较. 1.1 使用Thread类实现多线程 自 ...
- Oracle 触发器调用存储过程|转||待研究|
Oracle触发器调用存储过程资料收集整理 触发器:Trigger 存储过程:Stored Procedure // ******************** 收集1 **************** ...
- oracle入库的速度能到多少_多线程能提高Oracle的入库速度吗
多线程能提高Oracle的入库速度吗 最近常常和同事们讨论"系统架构",其中有不免提到如何使用"多线程"来改善系统性能.有些同事普遍有一种"认为&qu ...
- 多线程调用生成主键流水号存储过程产生主键冲突问题解决方案
遇到开发多线程测试插入数据的时候发现主键冲突问题 问题具体描述如下: -------------------------------------------------------------- 调用 ...
- oracle ajax储存过程分页,创建 Oracle 分页存储过程
1.创建Oracle包的定义.使用 REF CURSOR 数据类型来处理 Oracle 结果集.REF CURSOR 是一个指向 PL/SQL 查询所返回的结果集的指针.与普通的游标不同,REF CU ...
- oracle存储while用mysql_oracle存储过程while
Oracle下我个人认为有些事情不一定用存储过程,但还是说一下 oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN ...
最新文章
- php入门时间,php入门教程(二十一) php日期与时间函数
- Redis的入门(一)安装,设置密码
- 零基础带你学习MySQL—备份恢复数据库(三)
- 51Nod-1013 3的幂的和【快速模幂+逆元】
- @转载 ASP.NET跨页面传值技巧
- ActivityMQ安装部署
- 黑客帝国般的Linux屏保cmatrix的安装和使用
- 易地推拓客分享:内容获客是最稳定的获客方式之一
- 远程连接服务器出现channel is not opened通道未打开
- 自定义控件之下拉刷新列表
- c语言求最小公倍数_最小公倍数
- pip下载报错:pip._vendor.urllib3.exceptions.SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decry
- 关于excel导出日期格式变化问题处理
- 如何保证代码的健壮性和可读性
- 学习记录:Unity点击屏幕生成随机UI花朵
- Android S 新特性:应用行为更改
- C#,.net使用特性类,将json转为实体时验证字段
- 【k8s系列十二】k8s 之 Service的类型
- 多层嵌套json转换为Map再转换为单层
- 小哥哥,检索式chatbot了解一下?
热门文章
- epoll 编程注意事项以及参数查看
- 菜农“中国象棋数字编码”骗婚记
- 存储例题:2048*1024的32位全彩图像……
- 数据结构学习地址--上海交大acm试点班总教头俞勇老师讲的哦,还有其他课程地址,超全icourse
- 深度学习数据不均衡的处理方法
- win10开启护眼模式
- javaWeb实现空气质量的检测
- Android百度地图(三):百度地图画运动轨迹及图层点击事件处理
- Java mail接收邮件 回复邮件 转发邮件
- win2012 php5.2,windows2012core下php5.5兼容mssql数据库 (完美WASP环境搭建)