レコードがロックされている場合、どのレコードがロックされているかを知ることができますか? レコードのROWIDまたはその他の情報を取得するにはどうすればよいですか? このSQLでいくつかの情報を得ることができます SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW# FROM v$locked_object a, dba_objects b, v$session c WHERE a.object_id = b.object_id AND a.SESSION_ID = c.sid(+) 関数を使用してROWIDを取得する方法をWebで見つけました DBMS_ROWID.ROWID_CREATE() しかし、それは機能していないようです。
お客様のデータベースを追加のサーバーに移動した後、問題が発生しました。これはサイトのパフォーマンスにプラスの影響を与えるはずでしたが、MyISAMのテーブルロックに問題があります。(MyISAMの代わりにInnoDBを使用することを聞いたことがありますが、近い将来エンジンを変更することはできません)。 モデレーターが記事サイトのコメントをアクティブ化するときに実行されるupdate-queryにそれを見つけることができます。これはプロセスです: update-queryが処理されます SET status = 1 WHERE id = 5(インデックスが設定されます) ページのキャッシュファイルが削除されます この時点で、ページ全体が遅くなります。データベース自体は数分間ビジーです。私はプロセスリストを数回フェッチし、さまざまな選択クエリの約60のエントリを確認しました。これらはすべて、テーブルレベルのロックを待機している状態でした。 1.テーブルに対するこの更新が、テーブルレベルのロックを待機するテーブルのarticle_commentsselect-statementsに影響を与える理由がわかりませんarticle。プロセスリストでは、待機中のほとんどすべてのクエリがこのテーブルからのものでした。selectよりもupdate / insertが優先され、これがそのような問題を引き起こす可能性があるという事実を読みましたが、記事テーブル自体はコメントがアクティブになっても更新されないので、selectは待つべきではありません。私はそれを誤解しましたか? 2.この動作を防止するため、または少なくともより良いバランスを得るために、InnoDBに変更する以外に何かありますか?データベースを新しいサーバーに移動する前にこの問題が発生しなかったという事実に非常に苛立ちました。いくつかの設定ミスがあると思いますが、特定する方法がわかりません。
次の(ダミー)クエリを実行しています CREATE TABLE large_temp_table AS SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.foo = b.foo LEFT JOIN c ON a.bar = c.bar クエリの実行に10分かかるとします。テーブルa、b、cの実行中に値を更新しようとすると、上記のクエリが最初に完了するまで待機します。このロックを回避したい(データの整合性は重要ではない)。どうすればそれを達成できますか? 使用:MySQL 5.1.41およびInnoDBテーブル ps SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 動作に変化はありません 更新 クエリが実行されている間、SHOW ENGINE INNODB STATUSの出力は次のようになります(ここでは目的のために非常に遅いクエリを作成しています)。 ===================================== 120323 15:26:29 INNODB MONITOR OUTPUT ===================================== Per second …