問題タブ [table-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - mysqlの「Table_locks_immediate」と「Table_locks_waited」からDBの健全性を知る方法
DB ステータスから「Table_locks_immediate」と「Table_locks_waited」の値を見て、mysql db の状態を知る方法。
「Table_locks_immediate」と「Table_locks_waited」の比率が重要かどうかを知りたいです。
sql-server - SQL Server 2008R2: 'DELETE FROM' は永久にハングしますが、'SELECT' は正常に動作します
私は決してDBAではないので、これについては迷っています。152,000 行のテーブルがあります。私はこのステートメントを実行しようとしています:
DELETE FROM FILES WHERE Asset_Id = 340
そして、クエリウィンドウで永久にハングします-「クエリを実行しています...」とだけ表示されます。このステートメントは正常に機能します。
SELECT * FROM FILES
また、delete ステートメントを試した DB のコピーもあり、問題なく数秒以内に実行されました。ですから、そのテーブルで何かが起こっているに違いありません。ここで何が起こっている可能性がありますか?Web アプリの機能に影響を与えています。
ありがとう。
mysql - 長い LOCK TABLES 中の MySQL への通信リンク障害
私はいくつかの奇妙な行動に遭遇しています。準備済みステートメントとバッチ挿入を使用して、MySQL テーブルにデータを永続的に書き込む Java プログラムがあります。他のプロセスLOCK TABLES t WRITE
が同じテーブルに対して を発行し、その後すぐに (数分後に) リリースした場合、Java プログラムは期待どおりに続行します。ただし、ロックが長時間 (30 分以上) 続くと、Java プログラムは接続を失い、続行しません。2 時間後、通信リンク障害で失敗します。テーブル ロック中に保留中の挿入ステートメントは、ロックが解放された後に実行されますが、接続はその後失われます。
詳細は次のとおりです。
- MySQL 5.0.51a と 5.1.66 の両方で発生します。
- 最新の JDBC ドライバー mysql-connector-5.1.25-bin.jar を使用しています
- は
wait_timeout
28800 (8 時間) に設定されています。 - 通信リンク障害のスタック トレースと Java プログラムを以下に示します。
ここで何が起こっているか知っている人はいますか?設定/増加する必要があるタイムアウトはありますか?
2 時間後にスローされる例外:
完全な Java プログラム:
mysql - データロックによりクエリの実行が妨げられる - MySQL InnoDB
1 つの大きなログ テーブルからデータの合計と平均を計算し、常に多くの選択/更新クエリを持つ Main_Table (Innodb) のデータを更新するスクリプトを 24 時間ごとに実行する必要があります (毎秒約 1 回)。
約 10 分かかったローカル DB でテスト クエリを実行しました。
そして、これは Main_Table のすべての行を更新するため、テーブルのロッキングのためにすべてがライブ プロジェクトで動かなくなると思います - これが再び適切に機能するようにするには、クエリのプロセスを強制終了する必要がありました - データは更新されませんでした。
私はいくつかの掘り下げを行い、次の3つのオプションを検討しています。
- 一時テーブル内のすべてのデータを更新してから、何らかの方法で Main_Table にマージします。
- 1 つの MySql クエリではなく、php ループでスクリプトを実行します (時間がかかりますが、一度に 1 行ずつ更新します)。
- これが私たちの問題に関係しているかどうかはわかりませんが、「START TRANSACTION... etc」について何か読んだことがあります。
誰かがこれに光を当てて私たちを助けてくれることを願っています. ありがとう
php - InnoDB は、参照された ID が存在する場合にのみレコードを挿入します (FOREIGN KEYS なし)
外部キーは、この問題に対する最良のアプローチである可能性があります。ただし、テーブルのロック/トランザクションについて学習しようとしているので、当面は無視できることを願っています。
InnoDBデータベースに 2 つのテーブルがあるcategories
としましょうjokes
。そして、私はPHP/MySQLiを使用して作業を行っています。テーブルは次のようになります。
ここに 2 つの関数があり、それぞれが異なる接続によって同時に呼び出されています。呼び出しは次のとおりですdelete_category(1)
。add_joke(1,"Interrupting cow. Interrup-MOOOOOOOO!")
ここで、SELECT
両方の関数のステートメントが同時に実行され、そこから処理が進むとdelete_category
、カテゴリを削除しても問題ないと判断add_joke
され、ジョークを既存のカテゴリに追加しても問題ないと判断されるため、空のcategories
テーブルが得られます。および、joke
存在しない を参照するテーブル内のエントリcategory_id
。
外部キーを使用しない場合、この問題をどのように解決しますか?
これまでの私の最善の考えは、次のことを行うことです。
1)"LOCK TABLES categories WRITE, jokes WRITE"
の開始時delete_category
。ただし、私は InnoDB を使用しているため、テーブル全体 (特に頻繁に使用される主要なもの) をロックすることは避けたいと思っています。
2)add_joke
トランザクションを作成し、レコードを挿入した"SELECT id FROM categories WHERE id = '$category_id'"
後に実行する。その時点で存在しない場合は、トランザクションをロールバックします。ただし、 の 2 つのSELECT
ステートメントはadd_joke
異なる結果を返す可能性があるため、よく知らないトランザクション分離レベルを調べる必要があると思います。
これらの両方を行った場合、期待どおりに機能するはずです。それにもかかわらず、私はより多くの情報に基づいた意見を聞きたいと思っています。ありがとう。
php - 準備されたステートメントを使用した SELECT...FOR UPDATE が機能しない
fbのようなボタン関数(Facebook APIではありません)を作成しようとしています。私のウェブサイトには、好きと嫌いの 2 つのボタンがあります。データベースは、好きなものと嫌いなものの合計数を保存します。
db テーブルは次のとおりです。
ユーザーがいいねボタンをクリックしたときのコード:
ユーザーが異なるボタンをクリックしたときのコード:
ここに問題があります...
like_count の数は 0 から始まります。理論的には、ボタンをクリックする人が 1 人しかいない場合、
like_count
は 1 を超えたり 0 未満になったりしません。
1->行を解放->ボタンとは異なり表示)
(ボタンとは異なるクリック->行をロック->like_count-1->行を解放->ボタンのように表示)
ボタンをゆっくりクリックすると、この作業が正しく行われますが、ボタンをすばやくクリックし続けると、like_count の数が 2 を超えたり、負の数になったりすることがあります。
私は自分が何を間違ったのかわかりません。助けてください!