11

データベーステーブルに何かを挿入/更新しようとすると、Oracle はテーブル全体をロックしますか、それとも挿入/更新される行のみをロックしますか?

これは、外部構成によって制御できるものですか?

4

4 に答える 4

18

LOCK TABLE コマンドを使用して明示的にロックを発行できます。 詳細を見る

それ以外の場合、挿入は他の行をロックしません。Oracle の読み取り分離モデルにより、その行はコミットするまでセッションにのみ存在するため、他の誰もそれを操作できません。 詳細をご覧ください

update ステートメントは、影響を受ける行のみをロックします。SELECT ... FOR UPDATE を使用して悲観的なロック戦略を実装していない限り。 詳細をご覧ください

最後に、Oracle ではライターはリーダーをブロックしません。したがって、ロックされた行であっても他のセッションで読み取ることができますが、変更することはできません。 詳細をご覧ください

この動作は Oracle カーネルに組み込まれており、構成できません。


Justin は、テーブル レベルの DDL ロックについて良い点を指摘しています。DDL が CREATE INDEX のようなものでない限り、そのロックにより、テーブルで DDL を実行しているセッションは DML セッションがコミットされるまで待機します。この場合、ORA-00054 ですぐに失敗します。

于 2013-08-02T16:08:37.523 に答える
7

「ロック」の意味によって異なります。

行が変更されると、Oracle は行レベルのロックを取得します。行レベルのロックにより、リーダーは引き続き行を読み取ることができます (複数バージョンの読み取りの一貫性のため、ライターはリーダーをブロックせず、リーダーはダーティ リードを実行しません)。

調べてみるv$lockと、行を更新するとテーブルのロックも解除されることがわかります。ただし、そのロックは、別のセッションがテーブルで DDL を実行するのを防ぐだけです。そもそもアクティブなテーブルで DDL を実行することはほとんどないため、通常、別のセッションが実際にロックを待機する原因にはなりません。

于 2013-08-02T16:08:25.740 に答える
0

おそらく、ロックに関するオラクルの概念マニュアルを読む必要があります。標準の DML 操作 (挿入、更新、削除、マージ) の場合、oracle は共有 DML (タイプ TM) ロックを取得します。これにより、テーブル上の他の DML を同時に発生させることができます (共有ロックです)。更新または削除 DML 操作によって変更され、まだコミットされていない行には、排他的な行ロック (タイプ TX) が適用されます。別のセッション/トランザクションの別の DML 操作はテーブルで操作できますが、同じ行を変更すると、行ロックの所有者がコミットまたはロールバックして解放するまでブロックされます。

パラレル DML 操作とシリアル挿入直接ロード操作は、排他的なテーブル ロックを取得します。

于 2013-10-31T03:13:49.297 に答える