Dbテーブルに何かを挿入/更新しようとすると、Oracleはテーブル全体をロックするのか、それとも挿入/更新される行だけをロックするのですか?
これは外部設定で制御できるものですか?
LOCK TABLEコマンドで明示的にロックを発行できます。 詳細
それ以外の場合、挿入は他の行をロックしません。 Oracleの読み取り分離モデルのため、行はコミットするまでセッションにのみ存在するため、他の誰もそれを使用して何もできません。 詳細 。
更新ステートメントは影響を受ける行のみをロックします。 SELECT ... FOR UPDATEを使用して悲観的ロック戦略を実装していない限り。 詳細 。
最後に、Oracleでは、ライターはリーダーをブロックしません。そのため、ロックされた行でも他のセッションで読み取ることができますが、変更することはできません。 詳細 。
この動作はOracleカーネルに組み込まれており、構成できません。
ジャスティンは、テーブルレベルのDDLロックについて良い点を述べています。そのロックにより、DDLがCREATE INDEXのようなものでない限り、テーブルでDDLを実行しているセッションがDMLセッションがコミットするまで待機します。
それはあなたが「ロック」によって何を意味するかによる。
人々が気にする可能性のあるものの99.9%に対して、Oracleは行が変更されたときに行レベルのロックを取得します。行レベルのロックにより、リーダーは引き続き行を読み取ることができます(マルチバージョンの読み取りの一貫性のため、ライターはリーダーをブロックせず、リーダーはダーティリードを実行しません)。
あなたが周りをつつくならばv$lock
、行を更新するとテーブルのロックも解除されることがわかります。ただし、そのロックは、別のセッションがテーブルでDDLを実行することを防ぐだけです。そもそも、アクティブなテーブルでDDLを実行することはほとんどないので、通常、これは実際に別のセッションがロックを待機する原因にはなりません。
通常のDMLが実行されると(UPDATE/DELETE/INSERT、MERGE、およびSELECT ... FOR UPDATE)、Oracleは2つのロックを取得します。行レベルのロック(TX)-これは、タッチされている特定の行のロックを取得し、同じ行を変更しようとする他のトランザクションは、すでにそれを所有しているトランザクションが終了するまでブロックされます。テーブルレベルロック(TM)-行ロック(TX)が取得されると、DMLの進行中にDDL操作が発生しないように、追加のテーブルロックも取得されます。
重要なのは、どのモードでテーブルロックが取得されるかです。行共有ロック(RS)は、サブシェアテーブルロック(SS)とも呼ばれ、テーブルのロックを保持しているトランザクションがテーブル内の行をロックしており、それらを更新しようとしていることを示します。 SSロックは、テーブルロックの最も制限の少ないモードであり、テーブルに最高の同時実行性を提供します。
行排他ロック(RX)は、サブ排他テーブルロック(SX)とも呼ばれ、ロックを保持しているトランザクションがテーブル行を更新したか、SELECT ... FOR UPDATEを発行したことを示します。 SXロックにより、他のトランザクションが同じテーブル内の行を同時にクエリ、挿入、更新、削除、またはロックできます。したがって、SXロックを使用すると、複数のトランザクションで同じテーブルのSXロックとSSロックを同時に取得できます。
1つのトランザクションが保持する共有テーブルロック(S)は、他のトランザクションが(SELECT ... FOR UPDATEを使用せずに)テーブルをクエリできるようにしますが、単一のトランザクションが共有テーブルロックを保持している場合にのみ更新を許可します。複数のトランザクションが共有テーブルロックを同時に保持する可能性があるため、このロックを保持するだけでは、トランザクションがテーブルを変更できるようにするには不十分です。
共有行排他的テーブルロック(SRX)は、共有サブ排他的テーブルロック(SSX)とも呼ばれ、共有テーブルロックよりも制限的です。一度に1つのトランザクションのみが、特定のテーブルのSSXロックを取得できます。トランザクションが保持するSSXロックにより、他のトランザクションはテーブルをクエリできます(SELECT ... FOR UPDATEを除く)が、テーブルを更新することはできません。
排他的テーブルロック(X)は、テーブルロックの最も制限的なモードであり、ロックを保持するトランザクションがテーブルへの排他的書き込みアクセスを許可します。 1つのトランザクションのみがテーブルのXロックを取得できます。
ロックについては、おそらくOracleのコンセプトマニュアルをお読みください。標準のDML操作(挿入、更新、削除、マージ)の場合、Oracleは共有DML(タイプTM)ロックを取得します。これにより、テーブルの他のDMLを同時に発生させることができます(共有ロックです)。更新または削除DML操作によって変更され、まだコミットされていない行には、排他的な行ロック(TXタイプ)があります。別のセッション/トランザクションの別のDML操作はテーブルを操作できますが、同じ行を変更した場合、行ロックの保持者がコミットまたはロールバックして解放するまでブロックされます。
パラレルDML操作とシリアル挿入ダイレクトロード操作は、排他的なテーブルロックを取得します。