2017-02-19 12 views
1

セッション1でこのクエリがあります。 select * from xここで、x.id = 625は更新nowait; と私はセッション2で別のクエリを持っています: 更新xセットx.code = 0ここでid = 625; 私は、セッション1がコミットまたはロールバックするのを待っているセッション2を望んでいません。 セッション1がコミットされなくなるまで、セッション2にエラーを発生させたい。 私の問題はセッション2がセッション1がリソースを解放するのを待つことです。オラクル行レベルのロックで、他のセッションにエラーが発生しない

答えて

3

セッション2では、別のSELECT FOR UPDATE NOWAITを発行してレコードのロックを取得し、同じトランザクションで更新を行う必要があります。

SELECT FOR UPDATEステートメントは、更新する同じレコードをロックするために、同じWHEREの条件をUPDATEとして使用する必要があります。

レコードが既にロックされている場合は、最初のSELECT FOR UPDATEスロー:
ORA-00054を:リソース忙しいとNOWAIT指定またはタイムアウトで取得は

SELECT 1 FROM x WHERE id = 625 FOR UPDATE NOWAIT; 
update x set x.code = 0 where id = 625 ; 
+0

親愛なるkrokodilkoを満了し、あなたの答えをありがとうございましたが、そこにありますこの問題に利用可能な他の解決策はありますか?あなたのソリューションでは、コードプロジェクト内のいくつかの場所を変更し、更新前または削除前に「SELECT FOR UPDATE NOWAIT」を追加する必要があるためです。 –

+1

レコードがロックされているときに例外をスローしたい場合は、noを指定します。他の解決策はありません。 'SELECT FOR UPDATE NOWAIT'はOracleの唯一のコマンドです。そのような場合にエラーをスローすることができます。他のすべてのDMLコマンド(更新、削除、挿入も時々実行します)は、ロックが解放されるのを待ちます。標準のSQL動作です。 – krokodilko

+0

あなたはどのような問題を解決しようとしていますか? – BobC

関連する問題