`
琼海溜
  • 浏览: 18750 次
  • 性别: Icon_minigender_1
  • 来自: 海口
社区版块
存档分类
最新评论

Oracle Sequence使用注意

阅读更多

情况大概是这样:项目中使用Oracle的Sequence来生成流水号,并设置cache为20,。然后通过测试环节后交付给客户上生产。然后一段时间后,客户反馈说有bug。拿到生产环境的数据库dump部署后一查,发现相关数据确实有问题:

1)如果按照流水号从小到大,数据入库时间不连续,并且流水号跳号,比如从1000、1001直接到1020,中间丢了1002~1019。

2)如果按照数据入库时间从小到大,流水号跳号并且是穿插,比如从1000、1001直接到1020,然后是1002,、1003、然后是1021。

 

通过查找资料以及结合生产环境的Oracle使用RAC推断,上面的2)才是数据入库的方式:

RAC有2个节点,节点1和节点2。假设某个表的Sequence从1000开始,cache20个。一开始请求从节点1拿流水号,使得节点1缓存20个流水号(1000~1019),在使用了1000、1001之后,请求被切到节点2,然后节点2也缓存20个流水号(1020~1039),在使用了1020之后请求再被切回节点1,继续使用接下来的1002和1003,再切回节点2使用1021。如此造成流水号穿插跳号情形。因此如果我们的sql里面对流水号有一些max,min,>=、<=等等类型的操作,那么可能就会有问题。

相关Oracle资料也介绍,Sequence只能保证唯一,不能保证连续(即可能跳号,比如share_pool被刷或宕机后,原cache的流水号将丢失。还有就是事务回滚也会导致流水号跳号)。

而我这里遇到的场景要特殊,是穿插跳号,而不是单向跳号,情况更严重。

 

解决:

1)对于业务流水号(就是那种需要显示出来给客户看的,比如XXX编码),并且要求严格连续而且唯一的那种,还是自定义流水号生成器吧。

2)如果只是数据流水号,可以修改Sequence为nocache,这样能保证单向唯一,但还不能保证连续(因为事务回滚)。我们就是采取这种方式,因为底层sql大部分都是采用Sequence,如果全部改掉,工作量大,何况已上生产,采用折中方案。如果是处于开发阶段,可以考虑全部采用1)中说的自定义流水号生成器。

 

总结:

Q:为什么问题到了生产才出现?

A:

--我们在测试环节并没有真正完全模拟生产环境,没有部署RAC。

--对Sequence,前期基本就是知道怎么用,而没有真正去了解过使用的注意事项。

 

记录下来,避免重复踩到一个坑里面。

 

 

0
3
分享到:
评论

相关推荐

    Oracle sequence 重置(失效恢复)

    然后,我们使用一个PL/SQL块来遍历所有需要重置的Sequence,并根据表中的最大主键值来设置Sequence的起始值。 #### 1. 定义函数`func_getseq` ```sql CREATE OR REPLACE FUNCTION func_getseq (in_table VARCHAR2)...

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

    5. SEQUENCE 的注意事项 * 第一次 NEXTVAL 返回的是初始值;随后的 NEXTVAL 会自动增加你定义的 INCREMENT BY 值,然后返回增加后的值。 * CURRVAL 总是返回当前 SEQUENCE 的值,但是在第一次 NEXTVAL 初始化之后...

    ORACLE SEQUENCE的简单介绍

    为了在 Oracle 中使用 Sequence,首先需要确保拥有相应的权限,通常是 `CREATE SEQUENCE` 或者 `CREATE ANY SEQUENCE` 权限。创建 Sequence 的基本语法如下: ```sql CREATE SEQUENCE sequence_name INCREMENT BY ...

    oracle中的sequence实现主键增长

    4. **Sequence的注意事项**: - 第一次使用`NEXTVAL`时,返回的是`START WITH`指定的初始值,之后每次调用都会自动增加`INCREMENT BY`的值。 - `CURRVAL`在首次调用`NEXTVAL`之后才能使用,否则会导致`ORA-08004: ...

    oracle GoldenGate 同步oracle sequence的步骤

    ### Oracle GoldenGate 同步 Oracle Sequence 的步骤 Oracle GoldenGate 是一款强大的数据复制软件,能够实现跨平台的数据复制。在企业级应用环境中,为了确保数据的一致性和完整性,经常需要将源数据库中的序列...

    Hibernate Oracle sequence的使用技巧

    本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的表创建各自的sequence。在Oracle数据库中,你可以通过SQL语句创建一个sequence,例如: ```...

    oracle_sequence.rar_oracle

    创建Oracle序列使用CREATE SEQUENCE语句。例如,以下语句创建了一个名为"SEQ_TEST"的递增序列,初始值为1,每次增长1: ```sql CREATE SEQUENCE SEQ_TEST START WITH 1 INCREMENT BY 1; ``` 你可以根据需求调整序列...

    oracle自动增长列

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

    Sequence简单介绍.pdf

    本篇文章主要聚焦于Oracle数据库与SQL Server数据库中序列的具体实现方式及其迁移过程中的一些注意事项。 #### Oracle与SQL Server中的序列差异 - **Oracle端**:在Oracle数据库中,`Sequence`是生成连续数字的一种...

    sequence等同于序列号

    本文将详细介绍`sequence`的基本概念、创建方法、使用场景及注意事项。 #### 二、创建Sequence 创建`sequence`时,需要具有`CREATE SEQUENCE`或`CREATE ANY SEQUENCE`权限。以下是一个创建`sequence`的基本语法: ...

    Oracle、DB2、PostgreSQL之Sequence总结

    在Oracle中,Identity功能相对较新,与Sequence类似但使用更简便。在DB2和PostgreSQL中,Identity的概念与Sequence相对应,但它们的用法和管理方式略有不同。 总的来说,Sequence在Oracle、DB2和PostgreSQL中的实现...

    sqlserver实现oracle的sequence方法

    此外,SQL Server也提供了一些其他机制,如`SEQUENCE`对象(自SQL Server 2012起引入),它可以创建类似于Oracle Sequence的对象,但同样不能直接在非存储过程的`SELECT`语句中使用。如果你使用的是SQL Server 2012...

    Oracle创建自增字段sequence

    需要注意的是,`CURRVAL`必须在首次使用`NEXTVAL`初始化序列后才能使用,否则会导致错误。同时,每个`NEXTVAL`调用都会增加序列值,因此在同一个SQL语句中多次调用`NEXTVAL`将得到不同的值。 在实际应用中,序列常...

    oracle sequence语句重置方介绍

    Oracle Sequence 是数据库中用于生成唯一序列号的一种对象,它在数据插入、主键生成或作为唯一标识符时非常有用。在开发过程中,我们有时需要重置Oracle Sequence,使其从特定值开始重新计数,比如从1开始。以下将...

    Oracle创建自增字段--ORACLE SEQUENCE的简单使用介绍

    本篇文章将详细介绍Oracle如何创建、使用、修改以及删除自增字段所用到的SEQUENCE。 首先,创建一个Oracle序列(SEQUENCE)可以使用`CREATE SEQUENCE`语句。例如,创建名为`S_S_DEPART`的序列: ```sql CREATE ...

    MYSQL到ORACLE程序迁移的注意事项

    MySQL到Oracle数据库迁移的过程中,需要注意一系列的差异和调整,以确保迁移后的应用程序能够正常运行。以下是一些关键点的详细说明: 1. **自动增长的数据类型处理**: 在MySQL中,`AUTO_INCREMENT`字段自动分配...

    Oracle数据库中序列的使用

    ### Oracle数据库中序列的使用 在Oracle数据库管理中,序列是一种非常实用的对象,它能够自动生成唯一的数值。这种特性使得序列在很多应用场景中都极为重要,比如为表中的记录自动分配唯一标识符(如主键)。本文将...

    快速Java和Oracle集成SSH开发注意问题.pdf

    ### 快速Java和Oracle集成SSH开发注意问题 #### Oracle基本操作 **1. 登录** - 使用ORACLE系统自带管理员(SYSTEM)用户登录,权限设置为DBA(拥有广泛的权限)。通常,在进行数据库管理操作时,推荐使用具有...

    Oracle使用序列创建自增字段

    ### Oracle 使用序列创建自增字段 在数据库设计与开发中,自增字段是十分常见的需求之一,尤其是在需要为每一行记录自动分配一个唯一编号的情况下。Oracle 数据库通过序列(Sequence)这一特性支持自增字段的实现。...

Global site tag (gtag.js) - Google Analytics