`

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

 

  • 大小: 36.5 KB
  • 大小: 98.1 KB
分享到:
评论
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;
/

3 楼 dolphin_ygj 2009-03-06  
charles751 写道
这是真实项目中的应用吗?


是的
2 楼 lwx_1987 2009-03-06  
不是很懂!
1 楼 charles751 2009-03-06  
这是真实项目中的应用吗?

相关推荐

    oracle 存储过程使用 sequence

    在这个存储过程中,`p_user_id`是一个输出参数,用于接收Sequence的下一个值。`SELECT USER_SEQ.NEXTVAL FROM DUAL;`这行代码会获取`USER_SEQ`的下一个值,并赋值给`p_user_id`。然后,这个ID被插入到`users`表中,...

    oracle中的sequence实现主键增长

    - 如果在多线程环境中,多个线程同时尝试获取序列值,可能会出现并发问题。虽然几率较小,但仍然需要考虑并发控制策略,例如使用`SELECT ... FOR UPDATE`语句。 5. **Sequence的优化**: - 缓存(CACHE)可以提高...

    ETL通用解决方案_oracle+存储过程实现.doc

    在“ETL通用解决方案_oracle+存储过程实现”中,主要探讨了如何利用Oracle数据库和存储过程来实现这一过程。以下是该方案涉及的主要知识点: 1. **数据规格化**:这是数据处理的第一步,确保数据的一致性和标准化,...

    如何为oracle中的表增加自动增长列.pdf

    在Oracle数据库中,表的自动增长列通常是指使用序列(SEQUENCE)或者使用Oracle提供的自动增长数据类型(例如:IDENTITY或者GENERATED AS IDENTITY),以实现表中某列值能够随着记录的增加而自动递增。本文将介绍...

    oracle自动增长列

    在Oracle数据库中,实现自动增长列的功能主要依赖于`SEQUENCE`对象。通过创建一个序列(SEQUENCE),可以方便地为表中的某列自动生成唯一的值,这对于主键或者需要唯一标识符的场景非常有用。 #### 1. SEQUENCE概述...

    oracle_sequence.rar_oracle

    在Oracle中,序列(Sequence)是一个非常重要的概念,它主要用于生成唯一的整数序列,常常被用来作为主键值,特别是在插入新记录时自动增加。在本篇文章中,我们将深入探讨Oracle序列的创建、使用以及其在实际应用中...

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    本篇文章将详细介绍如何利用PowerDesigner 12.5版本创建Oracle数据库表,并设置表的主键列为自动增长。 #### 二、准备工作 在开始之前,请确保已经安装了PowerDesigner 12.5,并且具备一定的Oracle数据库基础知识...

    oracle设置主外键即主键序列自动增长

    下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...

    在hibernate中实现oracle的自动增长

    在Hibernate中利用Oracle的序列(sequence)实现自动增长,不仅可以简化主键管理,还能提高数据一致性和安全性。通过在Hibernate映射文件中正确配置序列生成器,可以确保每个实体都有一个唯一的标识符,同时避免了手动...

    oracle中用序列实现自动增长值

    在Oracle数据库系统中,与SQL Server中的`IDENTITY`特性类似,我们可以通过使用序列(Sequences)来实现字段的自动增长值。序列是一种特殊的数据库对象,它可以生成一系列有序的数值,通常用于为表的主键字段提供...

    oracle触发器实现主键自动增长

    在Oracle数据库中,实现主键自动增长是一种常见的需求,尤其在设计高并发、大数据量的系统时,确保每个记录都有一个唯一且连续的标识符变得至关重要。本文将深入探讨如何利用Oracle触发器来实现这一功能,同时也会...

    Oracle sequence 重置(失效恢复)

    它可以被用来作为表中某一列的自动增长字段,例如主键ID。Sequence的主要优点是简单易用且性能高效。 #### 二、Sequence失效的原因 1. **数据迁移:** 当数据从一个环境迁移到另一个环境时,如果只是简单地复制了...

    oracle设置主键自动增长

    本文详细介绍了在 Oracle 数据库中设置主键自动增长的过程,包括创建表、创建序列、创建触发器以及相关操作等。通过这种方式,可以简化数据管理,提高开发效率,同时确保主键值的唯一性。希望这些知识点能对你有所...

    oracle id 自动递增

    Oracle数据库中的ID自动递增是通过序列(Sequence)和触发器(Trigger)配合实现的,这对于需要自动填充主键或其他顺序标识字段的情况非常有用。序列是一个数据库对象,它按照预定的规则(如每次递增1)生成唯一的...

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    * 一次 NEXTVAL 会增加一次 SEQUENCE 的值,所以如果你在同一个语句里面使用多个 NEXTVAL,其值就是不一样的。 * 如果指定 CACHE 值,ORACLE 就可以预先在内存里面放置一些 SEQUENCE,这样存取的快些。但是,使用 ...

    Oracle存储过程分页

    在Oracle数据库中,实现分页查询通常有两种方法:一种是使用`ROWNUM`伪列,另一种则是通过存储过程实现。其中,使用存储过程进行分页更加灵活且易于维护。 #### 二、存储过程分页的优势 1. **提高性能**:存储过程...

    oracle_EBS_表结构

    - **BILL_SEQUENCE_ID (NUMBER)**:与主表中的BILL_SEQUENCE_ID关联,表示该组件属于哪个BOM。 - **OPERATION_SEQ_NUM (NUMBER)**:操作序列号,用于定义组装过程中各个组件的顺序。 - **COMPONENT_ITEM_ID (NUMBER)...

    OracleID自增长

    本文详细介绍了如何在Oracle数据库中实现ID自增长功能,包括创建表、创建序列、创建触发器等步骤。通过这种方式,可以有效地提高数据管理和维护的效率。对于需要频繁处理大量数据的应用来说,这种方法非常实用且有效...

    oracle里建一个自增字段示例

    在Oracle数据库中,自增字段通常通过序列(Sequence)和触发器(Trigger)来实现。本篇文章将详细解释如何创建一个自增字段,并通过具体的步骤和代码示例来进行说明。 #### 序列(Sequence) 序列是一种数据库对象...

    generate_sequence.rar_generate Sequence_generate_sequence_markov

    在这个"generate_sequence.rar"压缩包中,包含了四个MATLAB脚本文件,它们都是为了生成特定类型的马尔科夫序列。让我们逐一了解这些文件的功能: 1. **generate_sequence1.m**:这个脚本很可能是用来生成一阶...

Global site tag (gtag.js) - Google Analytics