日期:2014-05-17  浏览次数:21364 次

oracle 存储过程并发问题~
下边这个存储过程 从一个表里 取出一个字段值 取出之前 先做+1的操作。
如果多个程序同时运行这个存储过程,会出现取出的值是重复的情况吗?
就大神指点。

create or replace procedure SP_GetXmInc(pTableName in nvarchar2,
                                        pFieldName in nvarchar2,
                                        pCondition in nvarchar2,
                                        cur_OUT    OUT SYS_REFCURSOR) is
  v_sql VARCHAR2(8000);
begin
  savepoint sp_begintran;
  v_sql := 'lock table ' || pTableName || ' in exclusive mode';
  execute immediate v_sql;
    
  v_sql := 'update ' || pTableName || ' set ' || pFieldName || ' = ' ||
           pFieldName || ' + 1';
  if (pCondition is not null) then
    v_sql := v_sql || ' where ' || pCondition;
  end if;

  execute immediate v_sql;

  v_sql := 'select ' || pFieldName || ' from ' || pTableName;
  if (pCondition is not null) then
    v_sql := v_sql || ' where ' || pCondition;
  end if;

  open cur_OUT for v_sql;
  commit;
exception
  when others then
  rollback  to sp_begintran; 
end SP_GetXmInc;

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

求指点啊 就剩下这些分了~ 

应该不会,因为你先有个锁表的过程,如果你把表锁住,另一个人就不能锁住表,他只能等你进行COMMIT之后才能就行LOCK,这样的话取到的值也是你UPDATE过后的值。

是啊 我也是这样想的 但是客户说取出来会有重复的值 就搞不懂为什么了。。。

尝试了一下,发现好像不是我们想的那样,锁住表的过程,另一个人只不过是不能提交,保险起见,建议用sequence来做

我测试锁住一个表 另外一个存储过程在执行的时候 就不能去锁这个表里 会等待第一个提交之后才能再去锁定的。 你用什么工具测试的?

直接在命令行输入锁表命令和update,不要COMMIT,
再打开一个窗口进行update。
这样你可以模拟出多个session操作