在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.主键冲突。

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

阅读 3.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏