- 浏览: 1201192 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
利用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了也利与多种数据库
评论
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; /
是的
发表评论
-
并发行级锁超2秒报警监控sql
2010-07-20 16:18 1948并发行级锁超2秒报警监控sql -
数据设计规范v
2010-06-22 19:47 0数据设计规范v -
Oracle 有趣排序包括那些
2010-06-20 16:51 1459按拼音排序 select * from table ... -
Oracle sql 性能优化调整
2010-06-20 16:15 1402Oracle sql ... -
Delete、Drop、Truncate的比较(转)
2010-05-31 13:39 1484Delete、Drop、Truncate的比较 关键字: d ... -
Oracle误操作解决方案(转)
2010-05-31 13:35 1399Oracle误操作解决方案 文章分类:数据库 一.误删除数 ... -
一个递归调用的存储过程
2010-04-19 01:51 1854一个递归调用的存储过程 -
oracle index学习总结
2009-12-08 10:44 19640oracle index 1.index需要储存空间 ... -
Jdbc 和hibernate
2009-11-16 23:38 1884Jdbc 和hibernate 一、Jdbc是java ... -
去掉 powerDesigner 中表设计时的 name和code联动的功能
2009-11-16 17:04 3503去掉 powerDesigner 中表设计时的 name和co ... -
oracle数据库索引未被使用的问题及其解决2007
2009-11-15 01:42 2138一次,在进行WEB页面上进行历史数据文件检查时,发现数据库访问 ... -
RMAN配置及备份与恢复练习
2009-09-27 18:06 16291.创建表空间SQL>create tablespace ... -
误删除数据后怎么立即恢复(不考虑全库备份和利用归档日志)
2009-09-27 18:01 3390要达到删除数据,有以下几种方式都可以:1、delete2、dr ... -
IMP数据到指定的表空间
2009-09-27 12:47 9114IMP数据到指定的表空间 一直以来,我都认为只要指定用户的默 ... -
ORACLE UPDATE 语句语法与性能分析
2009-09-27 09:49 1887为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在 ... -
oracle job 例子
2009-09-22 12:38 3073一、设置初始化参 ... -
oracle 时间加减综合
2009-09-17 11:43 1987加法 select sysdate,add_mon ... -
详细介绍ORACLE sqlplus命令
2009-09-09 16:42 2068一、ORACLE的启动和关闭1、在单机环境下要想启动或关闭OR ... -
AWR介绍与SYSAUX空间关系 SYASAUX表空间满了 系统慢
2009-09-08 09:45 7987AWR介绍与SYSAUX空间关系 2007-11-05 14 ... -
to_char 'NLS_DATE_LANGUAG参数
2009-09-02 18:41 1490select to_char(sysdate, 'Day'), ...
相关推荐
在这个存储过程中,`p_user_id`是一个输出参数,用于接收Sequence的下一个值。`SELECT USER_SEQ.NEXTVAL FROM DUAL;`这行代码会获取`USER_SEQ`的下一个值,并赋值给`p_user_id`。然后,这个ID被插入到`users`表中,...
- 如果在多线程环境中,多个线程同时尝试获取序列值,可能会出现并发问题。虽然几率较小,但仍然需要考虑并发控制策略,例如使用`SELECT ... FOR UPDATE`语句。 5. **Sequence的优化**: - 缓存(CACHE)可以提高...
在“ETL通用解决方案_oracle+存储过程实现”中,主要探讨了如何利用Oracle数据库和存储过程来实现这一过程。以下是该方案涉及的主要知识点: 1. **数据规格化**:这是数据处理的第一步,确保数据的一致性和标准化,...
在Oracle数据库中,表的自动增长列通常是指使用序列(SEQUENCE)或者使用Oracle提供的自动增长数据类型(例如:IDENTITY或者GENERATED AS IDENTITY),以实现表中某列值能够随着记录的增加而自动递增。本文将介绍...
在Oracle数据库中,实现自动增长列的功能主要依赖于`SEQUENCE`对象。通过创建一个序列(SEQUENCE),可以方便地为表中的某列自动生成唯一的值,这对于主键或者需要唯一标识符的场景非常有用。 #### 1. SEQUENCE概述...
在Oracle中,序列(Sequence)是一个非常重要的概念,它主要用于生成唯一的整数序列,常常被用来作为主键值,特别是在插入新记录时自动增加。在本篇文章中,我们将深入探讨Oracle序列的创建、使用以及其在实际应用中...
本篇文章将详细介绍如何利用PowerDesigner 12.5版本创建Oracle数据库表,并设置表的主键列为自动增长。 #### 二、准备工作 在开始之前,请确保已经安装了PowerDesigner 12.5,并且具备一定的Oracle数据库基础知识...
下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...
在Hibernate中利用Oracle的序列(sequence)实现自动增长,不仅可以简化主键管理,还能提高数据一致性和安全性。通过在Hibernate映射文件中正确配置序列生成器,可以确保每个实体都有一个唯一的标识符,同时避免了手动...
在Oracle数据库系统中,与SQL Server中的`IDENTITY`特性类似,我们可以通过使用序列(Sequences)来实现字段的自动增长值。序列是一种特殊的数据库对象,它可以生成一系列有序的数值,通常用于为表的主键字段提供...
在Oracle数据库中,实现主键自动增长是一种常见的需求,尤其在设计高并发、大数据量的系统时,确保每个记录都有一个唯一且连续的标识符变得至关重要。本文将深入探讨如何利用Oracle触发器来实现这一功能,同时也会...
它可以被用来作为表中某一列的自动增长字段,例如主键ID。Sequence的主要优点是简单易用且性能高效。 #### 二、Sequence失效的原因 1. **数据迁移:** 当数据从一个环境迁移到另一个环境时,如果只是简单地复制了...
本文详细介绍了在 Oracle 数据库中设置主键自动增长的过程,包括创建表、创建序列、创建触发器以及相关操作等。通过这种方式,可以简化数据管理,提高开发效率,同时确保主键值的唯一性。希望这些知识点能对你有所...
Oracle数据库中的ID自动递增是通过序列(Sequence)和触发器(Trigger)配合实现的,这对于需要自动填充主键或其他顺序标识字段的情况非常有用。序列是一个数据库对象,它按照预定的规则(如每次递增1)生成唯一的...
* 一次 NEXTVAL 会增加一次 SEQUENCE 的值,所以如果你在同一个语句里面使用多个 NEXTVAL,其值就是不一样的。 * 如果指定 CACHE 值,ORACLE 就可以预先在内存里面放置一些 SEQUENCE,这样存取的快些。但是,使用 ...
在Oracle数据库中,实现分页查询通常有两种方法:一种是使用`ROWNUM`伪列,另一种则是通过存储过程实现。其中,使用存储过程进行分页更加灵活且易于维护。 #### 二、存储过程分页的优势 1. **提高性能**:存储过程...
- **BILL_SEQUENCE_ID (NUMBER)**:与主表中的BILL_SEQUENCE_ID关联,表示该组件属于哪个BOM。 - **OPERATION_SEQ_NUM (NUMBER)**:操作序列号,用于定义组装过程中各个组件的顺序。 - **COMPONENT_ITEM_ID (NUMBER)...
本文详细介绍了如何在Oracle数据库中实现ID自增长功能,包括创建表、创建序列、创建触发器等步骤。通过这种方式,可以有效地提高数据管理和维护的效率。对于需要频繁处理大量数据的应用来说,这种方法非常实用且有效...
在Oracle数据库中,自增字段通常通过序列(Sequence)和触发器(Trigger)来实现。本篇文章将详细解释如何创建一个自增字段,并通过具体的步骤和代码示例来进行说明。 #### 序列(Sequence) 序列是一种数据库对象...
在这个"generate_sequence.rar"压缩包中,包含了四个MATLAB脚本文件,它们都是为了生成特定类型的马尔科夫序列。让我们逐一了解这些文件的功能: 1. **generate_sequence1.m**:这个脚本很可能是用来生成一阶...