検索
ホームページデータベースmysql チュートリアルMySQLのデッドロックの使い方と検出・回避方法を詳しく解説

推奨学習: mysql ビデオ チュートリアル

ロックを使用する場合、注意が必要な問題があります。排他ロックには相互に排他的な特性があることがわかっています。トランザクションまたはスレッドがロックを保持すると、他のスレッドがロックを取得できなくなり、ブロック待ちが発生し、ループ内で待機するとデッドロックが発生する可能性があります。

この問題をいくつかの側面から分析する必要があります。1 つはロックが解放されない理由、2 つ目はロックがブロックされた場合の対処方法、3 つ目はデッドロックがどのように発生するか、およびその回避方法です。

ロックの解放とブロック

レビュー: ロックはいつ解放されますか?
トランザクションが終了します (コミット、ロールバック);
クライアント接続が切断されます。

トランザクションがロックを解放していない場合、他のトランザクションはどのくらいブロックされますか?永久に待機しますか?
そうである場合、同時アクセスが比較的多いとき、トランザクション数が多い場合必要なロックをすぐに取得できないためブロックされており、ハングすると多くのコンピュータ リソースが占有され、重大なパフォーマンス上の問題が発生し、さらにはデータベース全体に影響を及ぼします。

オンラインでのこの間違いが怖いですか?

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

MySQL には、ロックを取得するまでの待ち時間を制御するパラメータがあり、デフォルトは 50 秒です。

show VARIABLES like "innodb_lock_wait_timeout";

デッドロックの場合、いくら待ってもロックが取得できません。この場合、50秒待つ必要がありますか?その50秒は無駄ではありませんか?

デッドロックの発生と検出

デモンストレーション、2 つのセッションを開く:

タイムラインの撤回を容易にします。ここでは写真が使用されています。興味のある方は真似してください。

栗 1:

## 栗 2:

最初のトランザクションでは、デッドロックが検出され、すぐに終了しました。2 番目のトランザクションは、50 秒も待たずにロックを取得しました:

[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction

なぜ直接検出できるのでしょうか?これは、特定の条件を満たしている必要があるためです。私たちプログラマーにとって、明確な条件があるということは、判断できることを意味するため、デッドロックが発生した場合、通常、InnoDB はアルゴリズム (待機グラフ) を通じて自動的にそれを検出できます。

それでは、デッドロックが発生するにはどのような条件を満たす必要があるのでしょうか? ロック自体は相互に排他的であるため、デッドロックが発生する条件は次のとおりです:

    (1)同時に、このロックを保持しているトランザクションが存在するだけです;
  • (2) このトランザクションがロックを取得できるようになる前に、他のトランザクションがロックを解放する必要があり、ロックを強制的に剥奪することはできません;
  • ( 3) 複数のトランザクションが待ちループを形成すると、デッドロックが発生します。
その理髪店にはディレクターが 2 人います。髪を切る担当のトニー先生と髪を洗う担当のケルビン先生がいます。トニー先生は同時に 2 人の人の髪を切ることはできません。これを相互排除といいます。

トニーが誰かの髪を切っているとき、彼に立ち止まって髪を切るように頼むことはできません。これを 無理に奪うことはできません

といいます。

トニーのクライアントがケルビンに言った場合: あなたが洗ってくれないなら、どうやって髪を切ることができますか? ケルビンのクライアントがトニーに言った場合: あなたが髪を切らないなら、どうやって髪を洗えますか? これは呼ばれます 待機ループを形成します。
実際にはデッドロックが発生する状況は数多くありますが、それらはすべて上記の 3 つの条件を満たしています。 これは、テーブル ロックのリソースが一度にすべて取得されるため テーブル ロックによってデッドロックが発生しない理由でもあります。

ロックが解放されていない場合、大量のブロッキングやデッドロックが発生し、システムのスループットが低下する可能性があるため、どのトランザクションがロックを保持しているかを確認する必要があります。 ロック情報の表示 (ログ)

まず、SHow STATUS コマンドには行ロック情報が含まれています:

show status like 'innodb_row_lock_%';

##lnnodb_row_lock_current_waits: 現在待機しているロックの数;

lnnodb_row_lock_time: システムの起動から現在のロックまでの合計時間 (ミリ秒単位); Innodb_row_lock_time_avg: 毎回の待機に費やされる平均時間。

Innodb_row_lock_time_max: システムの起動から現在までの最長待機時間;
lnnodb_row_lock_waits: システムの起動から現在までの待機の合計数。



SHOW コマンドは概要情報です。 InnoDB には、トランザクションとロックを分析するための 3 つのテーブルも用意されています:

select * from information_schema.INNODB_TRX; --当前运行的所有事务﹐还有具体的语句

select* from information_schema.INNODB_LOCKS; --当前出现的锁

select * from information_schema.INNODB_LOCK_WAITS; --锁等待的对应关系

更加详细的锁信息,开启标准监控和锁监控:

额外的监控肯定会消耗额外的性能

set GLOBAL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

通过分析锁日志,找出持有锁的事务之后呢?
如果一个事务长时间持有锁不释放,可以kill事务对应的线程ID,也就是INNODB_TRX表中的trx_mysql_thread_id,例如执行kill 4,kill 7, kill 8。
当然,死锁的问题不能每次都靠kill线程来解决,这是治标不治本的行为。我们应该尽量在应用端,也就是在编码的过程中避免。
有哪些可以避免死锁的方法呢?

死锁的避免

  • 1、在程序中,操作多张表时,尽量以相同的顺序来访问(避免形成等待环路)
  • 2、批量操作单张表数据的时候,先对数据进行排序(避免形成等待环路);
  • 3、申请足够级别的锁,如果要操作数据,就申请排它锁;
  • 4、尽量使用索引访问数据,避免没有where条件的操作,避免锁表;
  • 5、如果可以,大事务化成小事务;
  • 6、使用等值查询而不是范围查询查询数据,命中记录,避免间隙锁对并发的影响。

推荐学习:mysql视频教程

以上がMySQLのデッドロックの使い方と検出・回避方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は脚本之家で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
酸性の特性(原子性、一貫性、分離、耐久性)を説明します。酸性の特性(原子性、一貫性、分離、耐久性)を説明します。Apr 16, 2025 am 12:20 AM

酸性属性には、原子性、一貫性、分離、耐久性が含まれ、データベース設計の基礎です。 1.原子性は、トランザクションが完全に成功するか、完全に失敗することを保証します。 2.一貫性により、データベースがトランザクションの前後に一貫性を保証します。 3.分離により、トランザクションが互いに干渉しないようにします。 4.永続性により、トランザクションの提出後にデータが永久に保存されることが保証されます。

MySQL:データベース管理システムとプログラミング言語MySQL:データベース管理システムとプログラミング言語Apr 16, 2025 am 12:19 AM

MySQLは、データベース管理システム(DBMS)であるだけでなく、プログラミング言語にも密接に関連しています。 1)DBMSとして、MySQLはデータを保存、整理、取得するために使用され、インデックスを最適化するとクエリのパフォーマンスが向上する可能性があります。 2)SQLとPythonに埋め込まれたプログラミング言語とSQLalchemyなどのORMツールを使用すると、操作を簡素化できます。 3)パフォーマンスの最適化には、インデックス、クエリ、キャッシュ、ライブラリ、テーブル分割、およびトランザクション管理が含まれます。

MySQL:SQLコマンドでデータの管理MySQL:SQLコマンドでデータの管理Apr 16, 2025 am 12:19 AM

MySQLはSQLコマンドを使用してデータを管理します。 1.基本コマンドには、select、挿入、更新、削除が含まれます。 2。高度な使用には、参加、サブクエリ、および集計関数が含まれます。 3.一般的なエラーには、構文、ロジック、パフォーマンスの問題が含まれます。 4。最適化のヒントには、インデックスの使用、Select*の回避、制限の使用が含まれます。

MySQLの目的:データを効果的に保存および管理しますMySQLの目的:データを効果的に保存および管理しますApr 16, 2025 am 12:16 AM

MySQLは、データの保存と管理に適した効率的なリレーショナルデータベース管理システムです。その利点には、高性能クエリ、柔軟なトランザクション処理、豊富なデータ型が含まれます。実際のアプリケーションでは、MySQLはeコマースプラットフォーム、ソーシャルネットワーク、コンテンツ管理システムでよく使用されますが、パフォーマンスの最適化、データセキュリティ、スケーラビリティに注意を払う必要があります。

SQLとMySQL:関係を理解するSQLとMySQL:関係を理解するApr 16, 2025 am 12:14 AM

SQLとMySQLの関係は、標準言語と特定の実装との関係です。 1.SQLは、リレーショナルデータベースの管理と操作に使用される標準言語であり、データの追加、削除、変更、クエリを可能にします。 2.MYSQLは、SQLを運用言語として使用し、効率的なデータストレージと管理を提供する特定のデータベース管理システムです。

Innodb Redoログの役割を説明し、ログを元に戻します。Innodb Redoログの役割を説明し、ログを元に戻します。Apr 15, 2025 am 12:16 AM

INNODBは、レドログと非論的なものを使用して、データの一貫性と信頼性を確保しています。 1.レドログは、クラッシュの回復とトランザクションの持続性を確保するために、データページの変更を記録します。 2.Undologsは、元のデータ値を記録し、トランザクションロールバックとMVCCをサポートします。

説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?Apr 15, 2025 am 12:15 AM

説明コマンドのキーメトリックには、タイプ、キー、行、および追加が含まれます。 1)タイプは、クエリのアクセスタイプを反映しています。値が高いほど、constなどの効率が高くなります。 2)キーは使用されているインデックスを表示し、nullはインデックスがないことを示します。 3)行はスキャンされた行の数を推定し、クエリのパフォーマンスに影響します。 4)追加の情報を最適化する必要があるというFilesortプロンプトを使用するなど、追加情報を提供します。

説明の一時的なステータスを使用し、それを回避する方法は何ですか?説明の一時的なステータスを使用し、それを回避する方法は何ですか?Apr 15, 2025 am 12:14 AM

Temporaryを使用すると、MySQLクエリに一時テーブルを作成する必要があることが示されています。これは、異なる列、またはインデックスされていない列を使用して順番に一般的に見られます。インデックスの発生を回避し、クエリを書き直し、クエリのパフォーマンスを改善できます。具体的には、expliect出力に使用を使用する場合、MySQLがクエリを処理するために一時テーブルを作成する必要があることを意味します。これは通常、次の場合に発生します。1)個別またはグループビーを使用する場合の重複排除またはグループ化。 2)Orderbyに非インデックス列が含まれているときに並べ替えます。 3)複雑なサブクエリを使用するか、操作に参加します。最適化方法には以下が含まれます。1)OrderbyとGroupB

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。