S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

SelectとPurgeTabelと排他制御

HiRDBではTruncateTableではなくPurgeTabelになります。
あるコネクションでSelect中(フェッチ処理とか)に、別のコネクションでPurgeTabelしようとすると排他がかかっちゃってます。
多分ここの記述がそう。DropTabelのこともここに書いてたりするけど、commitだけでコネクションのcloseには触れてないな?
UAPでできる排他制御



Oracleはこんなことらしい。
TRUNCATE と DELETE の違い - オラクル・Oracleをマスターするための基本と仕組み

ロックの影響を受けない SELECT と TRUNCATE は排他的な関係ではない。
単純な SELECT は共有ロックを取得しないため、SELECT と TRUNCATE は並行して実行される可能性があるかもしれない。(未検証) 参考: 表ロックの種類と相互関係
SELECT はキャッシュからせっせと情報を取り出す中、TRUNCATE はキャッシュと SQL をフラッシュする。仕事中の SELECT は八方ふさがり、途方にくれてしまうことになる。(※)
このことから TRUCATE 操作は抽出操作から隔離されたデータセグメントに使用しないと思わぬエラーに遭遇する可能性がある。
LOCK TABLE ROW EXCLUSIVE MODE を SELECT の前に行なうことで TRUNCATE 処理との衝突を避けることができるが、SELECT 時にロックするのは Oracle らしさが無くなるので控えたい。
DELETE の高速版と思って用いるとリリース後のピーク時になって問題が初めて見つかる可能性もある。 (致命的なバグほど起こって欲しくない時間帯を見定めて発生する。まさに、マーフィーの法則 (^^; )

なんらかの排他制御をすべきじゃなぁ〜
ちょっとバッチ処理のタイミングを安直に考えとったわ(−_−)