masahito123さんの投稿一覧
次のSQL文を順番に実行しました。
CREATE GLOBAL TEMPORARY TABLE temp
(
temp_id NUMBER(2),
temp_name VARCHAR2(20)
)
ON COMMIT PRESERVE ROWS;
INSERT INTO temp VALUES (1, 'tempA');
COMMIT;
この後の説明として正しい記述はどれですか(2つ選択して下さい)。
・他のセッションからTEMP表を参照すると、データは0件である
・TEMP表のデータは1件である
「上記2点が正解の回答となります」
「他のセッションからTEMP表を参照すると、データは0件である」という内容について理解できないので教えてください。
ON COMMIT PRESERVE ROWSにてセッションが終了したら内容が削除される記述になっていると思っています。
セッションの定義←オラクルにユーザーがアクセスするとデータを行き来するために作成されるトンネルのようなものと解釈しています。
セッションというのは各ユーザーがオラクルにアクセスするたびにそれぞれのセッションが作成されるイメージを持っています。←あっているでしょうか?
もし、セッションが各ユーザがオラクルにアクセスするたびに作成されるのであれば、上記セッションは終了しておらず他のセッションからTEMP表を参照するとデータが1件表示されるのではないか?
この問題に対して私の知識不足でわからない部分がありますのでよろしければご教授お願いいたします。
下記内容ですが上から順番に処理した場合に起こる内容が下記内容として解説されています。
ユーザーAが発行したFOR UPDATE WAIT 10はユーザーAの前の処理に対して働いていると考えますがあっているでしょうか?
また、解説③にはユーザーAがかけた排他ロックが解除されるまで待機するとありますが、これはユーザーBのSQL文でUPDATE prod SET name = 'Chopin' WHERE prodid = 2 の後に FOR UPDATE WAIT がありませんがデフォルトでそのような挙動になるのでしょうか?
お手数おかけしますがよろしければご教授お願いします。
ユーザーA:
SQL> SELECT prodid, name, category FROM prod WHERE prodid = 2
2 FOR UPDATE WAIT 10; … ①
ユーザーB:
SQL> SELECT * FROM prod WHERE prodid = 2
2 FOR UPDATE NOWAIT; … ②
SQL> UPDATE prod SET name = 'Chopin' WHERE prodid = 2; … ③
ユーザーA:
SQL> COMMIT;
ユーザーB:
SQL> COMMIT;
①:SELECT文にFOR UPDATE句が指定されているので、SELECT文で取り出される行に排他ロックがかけられます。
②:①でユーザーAが排他ロックをかけているため、ユーザーBはSELECT文にFOR UPDATE句を指定しても排他ロックをかけることはできません。さらにNOWAITオプションを指定しているので、SELECT文実行後、直ちにエラーとなります。
③:①でユーザーAが排他ロックをかけているため、ユーザーBがUPDATE文実行時、ユーザーAがかけた排他ロックが解除されるまで待機します。