2009年12月1日火曜日

Oracle Transaction制御 備忘録

 データベースに対して、シリアルに更新をかけたい場合に、ある処理に関しては、同時に2つのトランザクションが稼動してほしくない場合があります。どうやるか?

 トランザクション名を設定し、そのトランザクション名がトランザクション中かどうかを検索する。

SET TRANSACTION NAME 'HOGE_TRANSACTION';
BEGIN TRANSACTION;
INSERT INTO FUGA (NAME,VALUE) VALUES ('HIHO','HIHO');
...
COMMIT TRANSACTION;

というような更新をかけておき、以下のSQLを実行する

SELECT NAME FROM V$TRANSACTION WHERE NAME='HOGE_TRANSACTION';

尚、このような手法ができない場合には、特定のレコードをロックしておいて、ロックが成功するかどうかでも代用できる。その場合、

SELECT * FROM HOGE WHERE ID=9999999999 FOR UPDATE WAIT 1;

というように、WAIT 構文を利用できる。WAIT 構文が無い場合は、ごめんなさい。

0 件のコメント: