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;
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/SharkXu/p/OracleSEQ.html
Copyright © 2011-2022 走看看