[PHP+MySQL(MyISAM)] DB更新の速度で悩んでいます。


begin;
update A set〜
update A set〜
update A set〜
update A set〜
commit;

このupdateとupdateの間に他のユーザーのselectが割り込まれてしまいます。

begin;
update A set〜
select B〜
select C〜
select D〜
update A set〜
select D〜
select B〜
select C〜
update A set〜
select B〜
select C〜
select C〜
select B〜
select C〜
update A set〜
commit;

updateがすべて完了するまでにタイムアウトしてしまいます。原因はselectの割り込みなのかどうかも不明です。updateの前後でテーブルロック(lock tables)しても(Aのselectがロックできるだけで)無駄のようです。

なにか解決策があれば教えてください。

回答の条件
  • 1人2回まで
  • 登録:2006/06/16 13:56:18
  • 終了:2006/06/23 14:00:03

回答(2件)

id:tadashi0805 No.1

tadashi0805回答回数287ベストアンサー獲得回数292006/06/16 14:14:06

ポイント35pt

selectが行われなければ、タイムアウトは発生しないのでしょうか?

また、タイムアウトが発生する場合、どのくらいの時間がかかりますか?

なんとなくですが、updateが実際に実行しようとした際に、別の処理がロックを行って、デッドロックが発生しているような気がします。

更新(またはロック付き検索)は、他では行っていませんでしょうか。

id:asakura-t No.2

浅倉卓司回答回数151ベストアンサー獲得回数22006/06/16 14:48:08

ポイント35pt

どのようにLOCKしたのか分かりませんが、上のUPDATEの前に(begin commitのかわりに)

LOCK TABLES A WRITE, B WRITE, C WRITE, D WRITE;
UPDATE ...
UNLOCK TABLES;

とされてはいかがでしょうか?

(LOCKするテーブルは関係するテーブル「全て」を並べてください)

http://dev.mysql.com/doc/refman/4.1/ja/lock-tables.html


 あとはPHP側でpconnectを使っているのであれば、やめてみるとか。

  • id:k2017
    はてなのバグでコメントが書けませんでした。回答してくださったかたありがとうございました。原因はこちらのミス(updateのあいだに処理を挟んでいる)でした。すみません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません