web-dev-qa-db-ja.com

Oracleは1つのテーブルに対して複数の同時INSERTをどのように処理するか

Oracle 11gについてもう少し詳しく理解しようとしています。私の質問は単純です。Oracleは、単一のテーブルに同時にレコードを挿入しようとしている2つのセッションをどのように処理するのですか。

たとえば、INSERT Aは表1に対して午後1時に実行されます。完了するまでに5分かかります。 INSERT Bは1:02 PM=表1に対して実行されます。完了するまで1分かかります。

何が起こるか? Oracleは、INSERT Aが完了した後にINSERT Bを実行するようキューに入れますか? INSERT BはINSERT Aと同時に実行されますか?

ありがとう!

8
Dustin

挿入は、一意の制約または主キー制約と競合しない限り、相互に影響しません。彼らは独立している必要があります。この並行性の問題が、Oracleのシーケンスが個別のオブジェクト(キャッシュされたサロゲートPK生成と挿入から分離されている)である理由の1つだと思います。

その点では、セッションから見て、コミットされていないテーブルを操作します。この動作は、以下のstackoverflowの投稿で説明されています。

https://stackoverflow.com/questions/3194999/dml-by-multiple-users-commit-scenarios-in-Oracle

4
REW

おそらく Oracle Transaction Management(Concepts) または SQL Developer for Application Developers(Advanced Application Developer's Guide) を参照すると便利です。

Sqlplusでセッションを開き、settitng autocommitを実行してOracleの動作を調査できます。

set autocommit off

そして挿入の実行

tableAに挿入(...)値(...);

このセッションを開いたままにして、別のウィンドウからsqlplusセッションを開始し、自動コミットをオフに設定して、別の挿入を発行します。両方のトランザクションは、コミット(またはロールバック)で閉じるまでアクティブです。

ほとんどの場合、自動コミットをオフに設定する必要はありません。これを変更していない場合、これはsqlplkusのデフォルトです。

2
miracle173