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

排他処理に関して教えてください。
DBは、MySQL4.2 InnoDBです。
言語は、PHP(フレームワークCakePHP)

レコードを編集する際、編集画面に入る時、そのレコードのフラグをチェックし、Trueならば編集画面に入れ、Falseならば入れない仕組みを作りたいと思っております。
しかし、select文でフラグを確認し、Trueならばアップデート文でFalseに変更し、編集画面に入るやり方ですと、ほぼ同時にアクセスがあった場合、両方ともに編集画面に入れてしまいますよね?

簡単なフローを画像にしました。

トランザクションを掛けてる間、セレクトもさせない方法はあるのでしょうか。
テーブル自体をロックするしかないのでしょうか。


1229508526
●拡大する


●質問者: atoly
●カテゴリ:インターネット ウェブ制作
✍キーワード:CakePHP dB innodb PHP SELECT
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tdoi
●35ポイント

やりたいことを実現するには、どうしてもロックは必要かと思います。

テーブル自体をロックしてももちろんよいと思いますが、トランザクション処理中ということであれば、次のURLが参考になるかと思います。

http://mysql.telepac.pt/doc/refman/4.1/ja/innodb-locking-reads.h...


ただし、Webアプリだと思いますが、HTTPリクエストをまたがったトランザクション処理はいろいろ難しいので、ご注意ください。

参考:http://q.hatena.ne.jp/1178286217

◎質問者からの返答

とても参考になりました。

ありがとうございます。


2 ● b-wind
●35ポイント

MySQL4.2

そんなバージョンは存在しないんだけど、4.0.? or 4.1.? の間違いでは?

トランザクションを掛けてる間、セレクトもさせない方法はあるのでしょうか。

FOR UPDATE 構文を使えばいい。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.10.5 SELECT ... FOR UPDATE と SELECT ... LOCK IN SHARE MODE ロック読み取り

◎質問者からの返答

ありがとうございます。

昨日、これに辿り着きました。

失礼しました。

4.1.22でした。

関連質問


●質問をもっと探す●



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