`
qq_23269693
  • 浏览: 9093 次
社区版块
存档分类
最新评论

防跳号的两种方式

阅读更多

在财务上有一种需求,就是单据号必须连续不能中断.
这种需求用Oracle的序列不能实现,MySQL的auto_increment也不能实现.
因为事务回滚,或者实例重启,都可能造成单据号不连续的情况,就是跳号.

防止跳号有两种方式,但是前提都是不能删除数据.
第一种方式,用锁限制并发.
一个表有两个字段,一个是模块名称,一个是当前模块的序列值
create table tab_lock
(
    module_name varchar(10) primary key,
    current_value int
)engine=innodb;

insert into tab_lock values('HR',1),('IT',1);
commit;

使用的时候,用悲观锁锁住这行数据,然后使用这个值填充主键,最后让这个序列自增.
select * from tab_lock
where module_name='IT' for update;

update tab_lock
set current_value=current_value+1
where module_name='IT';

commit;

这种方式限制了并发.
一旦回滚,这个号码没有任何变化.这样可以保证单号的连续性.


-------------------------------------------------------------------------

还有一种方式,就是使用一个伪列作为单号.
主键不连续,而伪列单号可以连续.
create table order_log
(
    id int primary key
)engine=innodb;

insert into order_log
values
(1),(2),(4),(5),(7),(10),(13),(17),(20);
commit;

虽然主键不连续,但是可以通过下面的方式使单据号连续.

延迟关联实现分页,每页5条
第一页
select
concat('TX',lpad(b.rn,10,'0')),a.*
from
order_log a
,
(
    select * from
    (
        select
        id,
        @a := @a + 1 AS rn
        from order_log,
        (SELECT @a := 0) t order by id limit 5
    ) c  where rn>0
) b
where a.id=b.id;


第二页
select
concat('TX',lpad(b.rn,10,'0')),a.*
from
order_log a
,
(
    select * from
    (
        select
        id,
        @a := @a + 1 AS rn
        from order_log,
        (SELECT @a := 0) t order by id limit 10
    ) c  where rn>5
) b
where a.id=b.id;


第二种方式显然更好.
两种方式的前提都是不能删除表中数据.

第二种方式其实是
select
concat('TX',lpad(b.rn,10,'0')),a.*
from
order_log a
,
(
    select * from
    (
        select
        id,
        @a := @a + 1 AS rn
        from order_log,
        (SELECT @a := 0) t order by id limit ${pageSize}*${pageNum}
    ) c  where rn>${pageSize}*(${pageNum}-1)
) b
where a.id=b.id;

 

SpringMVC+mybatis HTML5 全新高大尚后台框架_集成代码生成器

5
8
分享到:
评论

相关推荐

    自动跳号的存储过程 自动跳号的存储过程

    自动跳号的存储过程也就是流水号,我写的这个流水号适合全事件任何一个地方的流水号都包括在内。

    自动跳号的函数和存储过程

    自动跳号的函数和存储过程 自动跳号的函数和存储过程

    SAP跳号处理

    SAP财务凭证的跳号查询处理方法。具体参阅文档。。。。

    分享ORACLE SEQUENCE跳号总结

    在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?  事务回滚引起的跳号  不管序列有...

    分段连续数字跳号查找

    分段连续数字跳号查找

    条码打印防重复软件

    防重复打印条码在线检查软件 :ROC300主要用来检测打印的条码是否可扫描,是否存在重号、漏号、 错号、跳号、超过范围等多种不良现象。实现条码打印及检测自动化,提高标签打印质量及效率、减少条码标签打印错误。

    word 2010 设置标题样式 编号 以及图片编号

    NULL 博文链接:https://liuwang126.iteye.com/blog/1388946

    ePdm System 文档管理系统 (部分源码)

    支持Access及SQL SERVER两种数据库, 可任意选择。使 用: 纯绿色软件, 无需安装。 第一次运行系统时,必须进行数据库配置(选择使用Access或SQL SERVER数据库)及系统配置。 Bin目录下的ePdm.Bak为SQL SERVER备份文件...

    NC单据号的生成

    系统之间数据交互生成NC单据,那么单据号的生成可以不填也可以通过代码生成,防止跳号

    公文格式—公文规格样式

    公文格式——即公文规格样式,是指公文中各个组成部分的构成方式,它和文种是公文外在形式的两个重要方面,直接关系到公文的效用的发挥。包括公文组成、公文用纸和装订要求等。 标题  "关于"要有,公文标题由发文...

    oracle常用分析函数与聚合函数的用法

    今天是2019年第一天,在此祝大家新年快乐,梦想还在路上,让我们继续加油! 应之前的计划,今天完成这篇记录,也借此记录自己...rank() 是排名的函数,该函数组内排序后会进行跳号,分数相同的作为并列。 dense_rank()

    用一句SQL解决SQL中断号问题 推荐

    比如,连续生成的编号,由于某种操作(通常为删除)后,产生不连续的编号,我们将这种不连续的编号称为断号。

    PBX 程控交换机 程控用户交换机 交换机日常维护 NORTEL_11C_培训教程.doc

    分机忙线跳号 d.分机权限设定 e. 分机状态查看 二.外线数据部份 a.E1外线的设定 Ⅰ.设定E1卡在交换机中的位置 Ⅱ.设定DCH卡的位置 Ⅲ.参数查看DCH资料 Ⅳ.设定E1路由 Ⅴ.在E1上设定E1数据 Ⅵ.查看...

    Oracle常用知识点小合集

    11g导出至10g、密码有效期问题、数据导出不完整、JOB不执行、创建大文件表空间、更改字符集、CPU使用情况、聚簇索引、通过dblink获取lob字段、无法识别本地sid、修复SPFILE文件、序列跳号问题、中文转拼音、自动备份...

    SQL性能优化

    1 性能优化 1.1 避免频繁 commit,尤其...说明:除非是单据的单号,要求必须是唯一,并且依据流水号不可以跳号,不然在大量交易的表格中,不在乎跳耗时,要取得唯一的Primary Key 建议使用Oracle Sequence这样速度会较...

    一号通 中继线路说明书

    一号通 中继线路说明书,描述原理和线路接法 调试密码口令步骤等内容

    EAS总账应用问题集2013

    316 凭证出现跳号 15 317凭证业务日前提交后无法修改 16 318凭证已指定流量在附表调整又要求再次调整 16 319标准凭证引入后希望制单人还是原凭证制单人 16 320凭证引出为模式凭证报错 16 321凭证重排的规则 16 322...

Global site tag (gtag.js) - Google Analytics