2016-08-10 5 views
0

私は今、私のシステムで膨大なリアルタイムトラブルを抱えています。サブスクリプションを登録できるとします。最大3人の参加者としましょう。 3人に達すると、皆のために購読を終了しなければなりません!これは私のコードの一部です:私の最後のサブスクリプションでサブスクリプションが閉鎖されません

   function subscription_data($subid) // activated by ajax 
       { 
        $sql = 'SELECT subEnrolled, subStatus FROM subscription WHERE subID=:subid'; 
        $stmt = $db->prepare($sql); 
        $stmt->bindparam("subid", $subid); 
        $stmt->execute(); 
        $row = $stmt->fetch(PDO::FETCH_ASSOC); 
        $subEnrolled = $row['subEnrolled']; 
        $subParticipants = '3'; 

        // is this subscription already closed ??? 
        if (!($row['subStatus'] =='1')) // if '1' not run anymore 
        {  
         if($subEnrolled+1 == $subParticipants) 
         { 
           $status1 = '1'; // close subscription for the NEXT fire 
           $sql = 'UPDATE subscription SET subStatus=:substatus WHERE subID=:subid'; 
           $stmt = $db->prepare($sql); 
           $stmt->bindparam("subid", $subid); 
           $stmt->bindparam("substatus",$status1); 

           $stmt->execute(); 
         }  

         // 
         // DO SOMETHING MORE 
         // 

         // Add to one enrollment 
         $add1enroll = '1'; 
         $sql = 'UPDATE subscription SET subEnrolled=subEnrolled+:subenrolled WHERE subID=:subid'; 
         $stmt = $db->prepare($sql); 
         $stmt->bindparam("subenrolled", $add1enroll); 
         $stmt->bindparam("subid", $subid); 
         $stmt->execute(); 
        } 
       } 

私の問題は、私は、例えばよりも前に、このサブスクリプションを閉じるしたいということです3人が登録します。しかし、私のAJAXボタンをクリックして複数のアカウント(4)でファンクションを起動すると、実際には3つのうち4つの登録ができます。上記の​​- これを避けようとしました。サブスクリプション。それは動作しません。

私の変数を理解したいと考えて、できるだけ論理的にしようとしました。上記のコードはtransaction()の関数の中にあり、一般的にInnoDBテーブルを使用していますが、これを変更しても同じ問題があります。

+0

サブスクリプションの数はどのように把握していますか? – Terminus

+0

を ''してください ''私は ''サブスクリプション ''テーブルを更新し、関数が実行されるたびに1つの登録を追加します。関数の起動時に、この番号(登録番号)を抽出し、それを変数 '$ subEnrolled'に入れます。上記は説明のためのものです –

+0

サブスクリプションを閉じても登録を追加しているようです。それはおそらく問題を引き起こします。 – Terminus

答えて

1

トランザクションで文をラップすると、INSERT、UPDATEなどの文を実行しようとしたときにのみ表ロックが適用されます。

登録の数を確認する別の条件をWHERE句に追加する必要があります。

UPDATE subscription 
SET subEnrolled=subEnrolled+:subenrolled 
WHERE 
    subID=:subid AND 
    subEnrolled < 3 

は、おそらくあまりにも​​から+1を削除する必要があります。

+0

Ok Terminus、それはうまくいく、私はこの重要な問題を確かめるために明日テストを終えるだろう。私は戻って取得することを忘れないでください、ありがとう! –

+0

私はたくさんの組み合わせを試しました。残念ながら私はまだ3回以上登録できます。 'if($ subEnrolled + 1 == $ subParticipants)'に '+ 1 'を入れずに、あなたの提案と共にWHERE句の' subEnrolled <3'が最初の登録の直後にサブスクリプションを終了します。また、このWHERE clausを 'subEnrolled + 1 = 3'に変更しようとしましたが、これは速く発射すれば3回以上の購読を可能にします... –

関連する問題