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と同時に実行されますか?
ありがとう!
挿入は、一意の制約または主キー制約と競合しない限り、相互に影響しません。彼らは独立している必要があります。この並行性の問題が、Oracleのシーケンスが個別のオブジェクト(キャッシュされたサロゲートPK生成と挿入から分離されている)である理由の1つだと思います。
その点では、セッションから見て、コミットされていないテーブルを操作します。この動作は、以下のstackoverflowの投稿で説明されています。
https://stackoverflow.com/questions/3194999/dml-by-multiple-users-commit-scenarios-in-Oracle
おそらく Oracle Transaction Management(Concepts) または SQL Developer for Application Developers(Advanced Application Developer's Guide) を参照すると便利です。
Sqlplusでセッションを開き、settitng autocommitを実行してOracleの動作を調査できます。
set autocommit off
そして挿入の実行
tableAに挿入(...)値(...);
このセッションを開いたままにして、別のウィンドウからsqlplusセッションを開始し、自動コミットをオフに設定して、別の挿入を発行します。両方のトランザクションは、コミット(またはロールバック)で閉じるまでアクティブです。
ほとんどの場合、自動コミットをオフに設定する必要はありません。これを変更していない場合、これはsqlplkusのデフォルトです。