人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[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がロックできるだけで)無駄のようです。

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

●質問者: k2017
●カテゴリ:ウェブ制作
✍キーワード:BEGIN dB MyISAM MySQL PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tadashi0805
●35ポイント

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

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

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

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


2 ● 浅倉卓司
●35ポイント

どのように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を使っているのであれば、やめてみるとか。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ