2011-01-12 11 views
3

現在、行をロックするためにSELECT FOR UPDATEを実装しようとしています。私が実行した場合:ORACLE PL/SQL:Oracle SQL DeveloperでのSELECT FOR UPDATEのテスト

SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE; 
SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE NOWAIT; 

私は戻っORACLE SQL Developerで何も得ます。これは私に間違いを投げるべきではありませんか?これは、同じユーザーIDを使用することと関係がありますか?

答えて

5

あなたは「私は戻って何も得る」とはどういう意味ですか?いずれのクエリもいずれの行も返さないことを意味しますか?その場合は、そのROWIDを持つ行が表にないことを意味します。最初の(または2番目の)文が返されないことを意味しますか?そうであれば、セッションはロックが獲得されるのを待ってブロックされます。

ロックはセッションごとに保持されます。 2つのステートメントが同じセッションで実行される場合、最初のステートメントが既にロックを取得しているため、2番目のステートメントは成功します。 2番目のステートメントが同じユーザーによって開かれた別のセッションで実行されている場合は、その行が別のセッションによって既にロックされているという例外を生成する必要があります。

+0

私が最初に考えたのは、同じ接続から作業していたので、単純に上書きされたということでした。あなたはそれを確認しました。ありがとう。 – jlrolin

1

すでにロックしているテーブルに対してロックを要求すると、にはのトランザクションがあります。

あなたは別の接続(すなわち、別のトランザクション)から2番目のSELECTを実行する必要が

+0

これは私が思ったことです...ありがとう。 – jlrolin