サーバのネットワーク切断トランザクションがコミットされていないため、MYSQLロックテーブルの問題(ADSLダイヤルアップ)

1886 ワード

環境の説明:
特殊な理由でサーバーのネットワークは電気通信ADSLダイヤルアップでインターネットに接続されており、「自動切替IP精霊」で自動断網再接続を行い、ネットワークを再接続するたびに2 s時間かかり、2時間に1回ネットワークを切り替えるように設定されている.
MYSQLデータベースはリモートの1台のサーバにあり、もう1台のテストデータベース(MYSQL、ADSLダイヤル)もあります.
プログラムが配備されていることを発見すると、なぜかテーブルがロックされ、テストデータベースに接続しても問題はありません.詳細ログに追加すると、トランザクションが開始された後、プログラムが複数のテーブルを更新している間に、「IPスプライトの自動切り替え」がネットワークを切り替えてネットワークが中断し、トランザクションがコミットされていないためロックテーブルが発生したことがわかります.なぜデータベースのテストに問題がないのですか?
その後、オンラインMYSQLバージョンは5.7.14で、テストデータベースバージョンは5.0.27で、データベースバージョンの更新資料を探して発見しました:5.5以降、その中に新しい機能があります.
             。  ,             ,            ,               (    http://blog.csdn.net/chajinglong/article/details/52939350)。 
、つまり5.5以降information_schemaライブラリにINNODB_が追加されましたTRX、INNODB_LOCKS、INNODB_LOCK_WAITSなどトランザクションに関連するテーブルが数枚あり、トランザクションのメタデータロックはトランザクションテーブルによってよりよく制御されます.これも、テスト・データベースにロック・テーブルがない理由です.  
ネットワークが切断されると、ロックされたテーブルが自動的に解放され、トランザクションがコミットされなくても、接続が中断されるとデータベースが解放されることを理解していました.
実はそうではありません.そのためにテストをします.
cmdは2つのデータベースの接続を開きます.
接続1:
mysql>set autocommit = 0;
mysql>begin;
mysql>update user set name='aa' where id = 1;
トランザクションをコミットせずに別のウィンドウを開く
接続2:
mysql>set autocommit = 0;
mysql>begin;
mysql>update user set name='aa' where id = 1;
接続2が保留中である
接続ウィンドウを閉じると、接続2はすぐに実行結果に戻ります.つまり、ウィンドウを閉じると、接続が中断されてデータベースが自動的にトランザクションを解放し、すぐにロールバックします.
しかし、接続プールでデータベースに接続し、ネットワークが切断された場合をシミュレートすると、SELECT*FROM information_schema.INNODB_TRX;トランザクションがコミットされておらず、ネットワーク・データベースが切断されたために自動的にロールバックされていないことがわかります(なぜそうなるのか分かりません).
コミットされていないトランザクションの解決方法は、次のとおりです.
トランザクションを開始したら、selectクエリーを1回実行し、SELECT TRX_を実行します.MYSQL_THREAD_ID FROM INFORMATION_SCHEMA.INNODB_TRX  WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID(); 現在の接続のtrx_を取得mysql_thread_id,最後kill trx_mysql_thread_idの値は、コミットされていないトランザクションを削除します.
皆さん、もっと良い解決方法があれば、お知らせください.