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


8

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

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

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

ありがとう!



もちろんです。ただし、意図的に完了するまで5分かかるクエリを作成する方法はわかりません。
ダスティン

3
大量のデータを挿入しますか?insert into foo(id) select level from dual connect by level<1000000(それは遅い十分になるまでの時間でゼロ1の数を増やす)
ジャックはtopanswers.xyzしようと言う

回答:


4

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

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

/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle


2

おそらく、Oracle Transaction Management(概念) または アプリケーション開発者のためのSQL処理(上級アプリケーション開発者ガイド)を確認すると便利です。

sqlplusを使用してセッションを開き、次のコマンドを実行して自動コミットを設定することにより、Oracleの動作を調査できます。

自動コミットをオフに設定する

そして挿入を実行する

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.