ホームページ >データベース >Oracle >Oracle での挿入はテーブルをロックしますか?

Oracle での挿入はテーブルをロックしますか?

WBOY
WBOYオリジナル
2022-05-30 16:29:118373ブラウズ

Oracle での Insert はテーブルをロックします。Oracle が Insert などの DML ステートメントを実行すると、操作中のテーブルにロックが適用されます。2 つの Insert ステートメントが同時にテーブルを操作しようとすると、セッションが発生しますが、セッションはブロックされ、他のセッションがコミットまたはロールバックするのを待機しているため、デッドロックが発生します。

Oracle での挿入はテーブルをロックしますか?

このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。

Oracle で挿入するとテーブルがロックされますか?

Oracle で挿入するとテーブルがロックされますか?

ORACLE が挿入などの DML ステートメントを実行すると、最初は操作対象のテーブルに対して自動的にTMロックを適用し、TMロックを取得すると自動的にTXタイプのロックを適用します。 2 つ以上のセッションがテーブルの同じレコードに対して DML 言語を実行すると、最初のセッションはレコードをロックし、他のセッションは最初のセッションのコミット後に TX ロックが解放されるまで待機状態になり、他のセッションはセッションのみになります。ロックすることができます。

これは、2 つの挿入ステートメントが同じ PK または一意の値を持つデータをテーブルに同時に挿入しようとするため、セッションがブロックされ、他のセッションがコミットまたはロールバックするのを待機するため、行き詰まり。

この場合、いずれかのセッションが送信される限り、もう一方のセッションは ORA-00001: 一意制約に違反し、デッドロックが終了するか、またはセッションの 1 つがロールバックされ、もう 1 つはロールバックされます。正常に実行できます。

Oracle では、テーブルをロックする理由は、プログラムがテーブルに対して挿入を実行し、まだコミットされていないときに、別のプログラムも同じテーブルに対して挿入を実行すると、この時点でリソースが発生するためです。ビジー例外、つまりテーブルをロックします。

テーブルをロックする主な理由は次のとおりです。

(1) プログラム A が tableA に対して挿入を実行し、コミット前にプログラム B も tableA に対して挿入を実行します。すると、この時点でリソース ビジー例外が発生します。これはロック テーブル

(2) ロック テーブルは、並列ではなく同時実行で発生することがよくあります (並列では、1 つのスレッドがデータベースを操作すると、他のスレッドはデータベースを操作できなくなります)。

テーブルがロックされる可能性を減らす方法:

(1) 挿入、更新、および削除ステートメントの実行と実行の間の時間を短縮します。専念。具体的には、バッチ実行をシングル実行に変更し、SQL 自体の非実行速度を最適化します。

(2) 例外が発生した場合はロールバックします

テーブルをロックする理由としては、次のことが考えられます。行データが変更され忘れられています。送信するとテーブルもロックされます。

知識を広げる:

テーブルをロックするときは、決定を下す前に理由を確認することをお勧めします。

1 ロック テーブル クエリのコードは次の形式です:

select count(*) from v$locked_object;
select * from v$locked_object;

2. どのテーブルがロックされているかを確認します

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

3 どのセッションが原因かを確認します

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order by b.logon_time;

推奨チュートリアル: 「Oracle ビデオ チュートリアル

以上がOracle での挿入はテーブルをロックしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。