理由: 1. トランザクション間のリソース アクセスの順序が交互になり、相手がロックしたテーブルに 2 人のユーザーがアクセスし、デッドロックが発生します。 2. 2 人のユーザーが同じレコードを同時に変更し、デッドロックが発生します。 ; 3 、条件を満たさないステートメントが実行され、不適切なインデックス作成によりグローバル スキャンでデッドロックが発生します。
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
データベースは複数のユーザーが使用する共有リソースであり、複数のユーザーが同時にデータにアクセスすると、データベース内で複数のトランザクションが同時に発生します。同じデータに。同時操作が制御されていない場合、誤ったデータが読み取られて保存され、データベースの一貫性が破壊される可能性があります。ロックは、データベースの同時実行制御を実現するために非常に重要なテクノロジです。実際のアプリケーションでは、ロック関連の例外が頻繁に発生します。2 つのトランザクションが一連の競合するロックを必要とし、トランザクションを続行できない場合、デッドロックが発生し、アプリケーションの通常の実行に重大な影響を及ぼします。
ロック タイプ:
1. 共有ロック (共有ロック、S ロック): 共有ロックを持つデータ オブジェクトは他のトランザクションから読み取ることができますが、改訂することはできません。データベースは、これら 2 つの基本的なロック タイプを使用して、データベース トランザクションの同時実行性を制御します。
2. 排他的ロック (X ロック): データ オブジェクトが排他的ロックでロックされている場合、他のトランザクションはそれを読み取りまたは変更できません。
3. 排他的ロック: 共有ロックに基づいて、排他的ロックにアップグレードされます。
4. 更新ロック: すべてのユーザーが読み取り可能ですが、将来更新操作を行う可能性があるため、共有ロック (読み取りに使用) から排他ロック (更新に使用) までの資格を取得しました。この対象となる更新ロックは、トランザクションごとに 1 つだけです。
発生原因:
1. トランザクション間のリソースアクセス順序の交代: ユーザー 1 がテーブル A にアクセスし (テーブル A をロック)、その後再びテーブル B にアクセスする; 別のユーザー 2 がテーブル B にアクセスし (テーブル B をロック)、その後テーブル A にアクセスしようとします。この時点で、ユーザー 2 がテーブル B をロックしているため、ユーザー 1 は続行する前にユーザー 2 がテーブル B を解放するまで待つ必要があります。同じユーザー2 は続行する前にユーザー 1 がテーブル A を解放するまで待つ必要があり、デッドロックが発生します。解決策: プログラム ロジックの問題。テーブル
2 の呼び出しシーケンスに注意してください。同じレコードを同時に変更する: ユーザー 1 がレコードをクエリしてからレコードを変更し、次にユーザー 2 がレコードを変更し、次にユーザーが変更します。 1 トランザクション内のロックの性質がクエリの共有ロックから排他ロックに増加しようとしましたが、ユーザー 2 の排他ロックは 1 が共有ロックを持っているため、1 が共有ロックを解放するまで待つ必要があります。 2 の排他ロックのため、1 を増やすことはできません。排他ロックにより共有ロックを解放できないため、デッドロックが発生します:
3. 不適切なインデックス作成によりテーブル全体のスキャンが発生します。トランザクションは条件を満たさないステートメントを実行します。条件を満たしている場合、テーブル全体のスキャンを実行している場合、またはテーブル データの量が非常に多い場合 作成されるインデックスが少なすぎるか不適切な場合
#解決策: SQL ステートメントで複数のテーブルを関連付けてビルドする過度に複雑なクエリを使用しないでください。最適化のためのインデックス注:1. oracle デッドロックの表示とデッドロックの解放select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid; alter system kill session '738,1429'; --释放资源2. mysql デッドロックの表示とデッドロックの解放
show processlist --查看数据库中各个进程的运行状态 select * from information_schema.innodb_trx ---查询正在运行的事务 kill id推奨チュートリアル: 「
Oracle ビデオ チュートリアル 」
以上がOracle デッドロックの原因は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。