アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも的確な回答に助けられていますm( __ __ )m

以下のようなメソッドがあるとします。

function test()
{
処理1: データベースから値を取得
処理2: 処理1 で取得した値に +1 する
処理3: 処理2 の結果をデータベースに書き込む
}

【質問】
関数 test がクライアント A と B の2人からほぼ同時にアクセスされた時、以下のような事が起きてしまうと思います。

・ A が 処理1 を実行
・ A が 処理2 を実行
・ B が 処理1 を実行
・ A が 処理3 を実行
・ B が 処理2 を実行
・ B が 処理3 を実行

当然データベースにある値は期待通りの値ではないと思います。
期待する動きとしては、A が関数 test の全ての処理を抜けるまで B は入り口で待機させるというようなことを想像しているのですが、
こういった場合、どのように排他制御したら良いのでしょうか?

私は C# で排他制御を実装した経験があるのですが、
C# では同期オブジェクトを用意して lock を使ったり、 ManualResetEvent などを用いることで排他制御が可能でした。

PHP でそれらに匹敵するようなものは存在するのでしょうか?

A 回答 (1件)

RDBの話ですよね?



単純にトランザクションで処理すればよいのでは?

この回答への補足

あ!なるほど!!

bigin ~ commit ってこういう時使うのですね!!
うぅ・・まだまだ基礎勉強が必要ですね;;

ところで、ついでに質問なのですが、
クライアント A が bigin してから commit まで1分かかるとして、
クライアント B がほぼ同時に来た場合は、B は1分待たされてから処理を行うというイメージでよろしいのでしょうか?

補足日時:2009/10/16 23:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!