集計をキャッシュしようとしていますが、同時実行性が原因で参照整合性違反が発生する可能性があります..
これが私がやっていることです(少し煮詰めたようなものです):
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;
ロジックは、削除は行をロックし(存在しない場合でも)、挿入は私がやりたいことを行います。
ティア。
ドン