zoukankan      html  css  js  c++  java
  • 关于流水帐表序列号生成时的并发操作问题

    关于流水帐表序列号生成时的并发操作问题
    1.某些流水张表的序号不是而是带有一定规则的,
      如:四位的年份+2位周数+7位数字的序号
          2007130000002.
      假定表的定义如下:

     Create Table T
     (ID 
    char(16not null primary key,
      Others 
    varchar2(100)
     )


       在这种情况使用序列是不可取的,这时候大家想到的有两种办法
      1.取该表本身的数据,在最近的一条记录的序号加一
        Select max(ID) from T where Substr(T.ID,1,6)=to_char(sysdate,'yyyyww')
        这种情况下,如果有两个应用程序同时执行插入流水帐,有可能得到的流水帐号相同,造成其中一个操作会失败。
        同时如果这张表数据量很大的时候,取这个最大值会花销一定的时间的。
      2.使用另外一张表来记录这个最大值。假定表的定义如下:    

    Create Table SEQ_T
    ( week 
    char(6),
      ID 
    number(10,0)
    )
    /
    Insert into SEQ_T values('200713',0)
    /

        但是同样会出现第一种解决办法发生的问题即
     如果有两个应用程序同时执行插入流水帐,有可能得到的流水帐号相同,造成其中一个操作会失败。

        
    如何解决这种并发查询得到相同序列号的问题呢.
    我们对第二种办法加以改进.
        第一步锁住这张序列号表.
        Lock Table SEQ_X;
        然后再执行第二种办法
        记住一定要commit; 否则无法解锁.

    有的人可能会说,其他Oracle会话,还是有可能通过第二种,第一种方法来获取序列号,这个你没有办法控制的.
    但是你要保证你的应用程序,只有这一个唯一的路径来插入流水帐表的.
    下面是我做的一个测试并发性问题的一个程序,大家可以启动多个客户端同时来执行它.

    Declare
     V_ID 
    Number(10);
     V_week 
    varchar2(10);
     v_week2 
    varchar2(10);
     num 
    number(10);
     n 
    number(5);
    Begin 
     
    FOR num IN 1..100000 LOOP 
      lock 
    TABLE SEQ_T in EXCLUSIVE MODE;  
      
    select week into v_week from SEQ_T where rownum=1;
      
    select ID into v_id from SEQ_T where rownum=1;
      v_week2:
    =to_char(sysdate,'yyyyww');
      
    if v_week = v_week2 then
       v_id :
    = v_id + 1;
      
    else 
       v_week :
    = v_week2;
       v_id :
    = 1;
      
    end if;
      
      
    update  seq_T
      
    set id = v_id,
       week 
    = v_week;
      
    insert into T values(v_week||to_char(v_id),'Test');
      
    commit;
     
    end loop;
    end;
  • 相关阅读:
    vscode入门使用教程(页面调试)
    .net core3.1开始页面实时编译
    Ubuntu 编辑文件、安装、删除软件等常用命令(持续更新)
    .NetCore3.1中的WebApi如何配置跨域
    PC电脑端如何多开Skype,一步搞定!
    简单几步为博客园添加动态动漫妹子
    如何在SqlServer中使用层级节点类型hierarchyid
    Entity framework Core 数据库迁移
    牛客网剑指offer【Python实现】——part1
    Linux实战——Shell编程练习(更新12题)
  • 原文地址:https://www.cnblogs.com/SharkXu/p/OracleSEQ.html
Copyright © 2011-2022 走看看