DB2将数据从登台表复制到主表而没有表锁定

时间:2017-05-11 09:05:14

标签: copy db2

我有2个表(1个临时表和1个主操作表)。
两个表都具有相同的结构。

对于我的解决方案,

  1. 我在程序中使用DB2Copy将10000条记录插入临时表(4秒)

  2. 从临时表中,将使用存储过程将数据移动到主表中(10秒)

  3. 但是,它会在运行存储过程时锁定主表。

  4. 我怀疑是因为BEGIN和END导致存储过程像事务一样行事。

  5. 我不希望在运行存储过程时锁定表。 (有任何建议吗?)
    首选:存储过程通过记录插入记录到主表中而没有事务行为。

  6. 以下是我的代码:

      CREATE PROCEDURE SP_NAME ( ) 
      LANGUAGE SQL
      NOT DETERMINISTIC
      CALLED ON NULL INPUT
      EXTERNAL ACTION
      OLD SAVEPOINT LEVEL
      MODIFIES SQL DATA
      INHERIT SPECIAL REGISTERS
      BEGIN 
        --DECLARE TEMP VARIABLES
    
        BEGIN
            DECLARE MYCURSOR CURSOR WITH RETURN TO CALLER FOR
            --SELECT STAGING TABLE
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET AT_END = 1;
    
            OPEN MYCURSOR;
                -- FETCH MYCURSOR INTO TEMP VARIABLES
    
            WHILE AT_END = 0 DO
    
                -- INSERT MAIN TABLE
                -- FETCH MYCURSOR INTO TEMP VARIABLES
    
            END WHILE;
            CLOSE MYCURSOR;
        END;
    END;
    

    我的环境

    1. 我有一个程序“A”试图将10k记录插入主表(很多索引和大量数据),这需要10分钟++。
    2. 关于主要操作表

      1. 前端有大量读取但最小的更新和插入。
      2. 在后端,另一个程序会经常在此表中插入记录。
      3. 只允许一次运行后端程序的一个实例

1 个答案:

答案 0 :(得分:1)

创建程序时,请确保您的承诺控制设置为*无(a.k.a. autocommit)。这不应该锁定你的整个表

添加示例

CREATE PROCEDURE userS.SP_TEST (                            
IN col_DATA Varchar(10) )                                   
LANGUAGE SQL                                                
SPECIFIC userS.SP_TEST                                      
NOT DETERMINISTIC                                           
MODIFIES SQL DATA                                           
SET OPTION COMMIT = *NONE                                   
BEGIN INSERT INTO userS.TABLE1 VALUES(col_DATA);            
END