締切済み

関数内の排他制御について

  • すぐに回答を!
  • 質問No.5372701
  • 閲覧数249
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 68% (31/45)

いつも的確な回答に助けられています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 でそれらに匹敵するようなものは存在するのでしょうか?

回答 (全1件)

  • 回答No.1

ベストアンサー率 51% (3827/7415)

RDBの話ですよね?

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

お礼率 68% (31/45)

あ!なるほど!!

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

ところで、ついでに質問なのですが、
クライアント A が bigin してから commit まで1分かかるとして、
クライアント B がほぼ同時に来た場合は、B は1分待たされてから処理を行うというイメージでよろしいのでしょうか?
投稿日時 - 2009-10-16 23:47:04
感謝経済、優待交換9月20日スタート
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ