在etl数据同步时出现的并发问题


目前需要从hr系统里使用etl将用户同步到um系统中。um的user_id是通过函数生成的。比如中文名:张三。生成的um账号(user_id)就是zhangsan001。如果已经有zhangsan001这个用户就+1生成zhangsan002。函数如下


 create or replace function generate_UM_id(chinese_word in varchar)  
    return varchar2  
is  
    seq int; --序列号
    PY  varchar2 (200); --拼音
begin  
    select fn_getpy(chinese_word) into PY from dual; --获得拼音
    --查询um账号
      select max(to_number(decode(REGEXP_SUBSTR(TRIM(user_id),'[0-9]+$')
    ,null,0,REGEXP_SUBSTR(TRIM(user_id)
    ,'[0-9]+$'))))+1 
    into seq  from t_user where user_id like PY||'%';

   -- select max(to_number(substr(user_id,-3))) into seq  from t_user where user_id like PY||'%';
    dbms_output.put('sequence ='|| seq);
    if (seq >= 1 and seq <10) then  
       return (PY ||'00'||seq);
    elsif (seq >= 10 and seq <100) then  
       return (PY ||'0'||seq);
    else
       return(PY ||seq);
    end if;  

end;

并发问题是。同步数据的时候会抛出主键冲突。大概几万的数据会有几十个。
就是在查询


 select max(to_number(decode(REGEXP_SUBSTR(TRIM(user_id),'[0-9]+$')
    ,null,0,REGEXP_SUBSTR(TRIM(user_id)
    ,'[0-9]+$'))))+1 
    into seq  from t_user where user_id like PY||'%';

的时候并发插入了同一个拼音 zhangsan 。数据库里有 zhangsan001 .同一个时间还没插入。并发几条数据都查询是 zhangsan001 .插入的时候就都是 zhangsan002 .主键冲突。

从小有点语体教。不知道自己有木有吧问题说清楚/糗大了。
求大神呀。小弟想了两天没什么好的头绪。

etl 数据库 java 并发

想打小怪兽了 10 years, 6 months ago

Your Answer