0

集計をキャッシュしようとしていますが、同時実行性が原因で参照整合性違反が発生する可能性があります..

これが私がやっていることです(少し煮詰めたようなものです):

select  low, high
into    l_low, l_high
from    nasd_stats
where   symbol_id = l_symbol_id;

if( l_low is NULL ) then 
      select  max(last),
              min(last)  
      into    l_high, l_low
      from    nasd
      where   symbol_id = l_symbol_id;

      insert  into nasd_stats values ( l_symbol_id, l_low, l_high );
end if;

したがって、2 人のユーザーがこのコードを含む sproc を実行し、同時に l_low が null であることを検出し、最小/最大集計の後に同時に nasd_stats に挿入しようとする可能性があります (そのうちの 1 つはsymbol_id に基づいて nasd_stats に一意のキーがあるため失敗します)。

それを防ぐ方法はありますか??

私はこれを行うことができると思います:

Start Transaction;
delete from nasd_stats where symbol_id = l_symbol_id;
insert into nasd_stats values ( l_symbol_id, l_low, l_high;
Commit;

ロジックは、削除は行をロックし(存在しない場合でも)、挿入は私がやりたいことを行います。

ティア。

ドン

4

2 に答える 2

1

キーが symbol_id フィールドで定義されている場合は、次の方法でクエリを実行します

insert  into nasd_stats Select  distinct l_symbol_id, l_low, l_high  from nasd_stats where not exists (Select 1 from nasd_stats where symbol_id  = l_symbol_id) ;
于 2012-04-29T10:37:49.980 に答える
0

挿入でシンボル ID を確認するだけで、それが存在し、誰かが既にそれを取得しているので、別の挿入を行う必要はありませんか?

したがって、コードは同じですが、挿入ステートメントは次のようになります

  insert  into nasd_stats values ( l_symbol_id, l_low, l_high ) where symbol_id =    l_symbol_id AND l_low is NULL ;
于 2013-09-24T20:38:06.527 に答える