1229508526 排他処理に関して教えてください。

DBは、MySQL4.2 InnoDBです。
言語は、PHP(フレームワークCakePHP)

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

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

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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2008/12/17 19:08:48
  • 終了:2008/12/18 13:59:04

回答(2件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752008/12/17 20:01:21

ポイント35pt

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

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

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


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

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

id:atoly

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

ありがとうございます。

2008/12/18 13:56:33
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/12/18 12:41:08

ポイント35pt

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 ロック読み取り

id:atoly

ありがとうございます。

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

失礼しました。

4.1.22でした。

2008/12/18 13:58:52
  • id:sphire
    true → false にUPDATEをかけた時に更新件数が1件だったら成功で
    0件だった場合には失敗、という処理でもいいかもしれませんね。

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

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

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

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