2011-04-07 6 views
0

私はPHPサイトをInterbase DBに接続しています。 DBには、ユーザーが読み込んで画面上に表示できるオーダーが含まれています。ユーザーは注文を変更して保存することができます。これは動作しますが、2人のユーザーが同じレコードを読み込んで保存すると、その注文には最後に保存したユーザーの変更が含まれます。PHPでInterbaseトランザクションを使用するにはどうすればよいですか?

2番目のユーザーが保存しようとしたとき注文が変更されたことを示すメッセージがポップアップされ、注文の保存が停止されます。

トランザクションを実装するデスクトップアプリケーションと上記のシナリオがあるため、interbaseにはこれを行うトランザクションがあることは知っています。しかし、Web環境でPHPを使って同じことをする方法はわかりません。

デスクトップアプリケーションは常にdbを開いたままにして、トランザクションはコミットされてから読み取られた時点から有効に保たれます。 PHPでは、各クエリが実行されるときにのみ、dbとトランザクションがオープン/作成されます。私が読んだことから、コミットされていなければ、スクリプトの最後にトランザクションがロールバックされます。

コードは、順番をロード

PHPコード:

public function GetOrderDetails($in_OrderID) 
{ 

    $qry = "SELECT ID, ... , FROM CUSTOMER_INVOICE WHERE ID = $in_OrderID";  

    $this->dbconn = ibase_connect ($this->host, $this->username, $this->password); 
    $this->dbtrans = ibase_trans(IBASE_DEFAULT,$this->dbconn);  
    $result = ibase_query ($this->dbtrans, $qry); 

    while($row = ibase_fetch_row($qryResult)) 
    { 
    } 
    ibase_free_result($in_FreeQry);  
    ibase_close($this->dbconn); 
} 

コードの保存順

PHPコード:誰も私を伝えることができるなら、私は間違って行くよどこ

public function SaveOrderDetails() 
{ 
    $DoCommit = false; 
    try 
    {  
     $this->dbconn = ibase_connect ($this->host, $this->username, $this->password); 
     $this->dbtrans = ibase_trans(IBASE_DEFAULT,$this->dbconn);  

     // Insert/Update the order 
     if($this->UpdateOrder()) 
     { 
     // Insert Order Items 
     if($this->InsertOrderItems()) 
     {    
      $DoCommit = true; 
     } 
     else 
     { 
      $this->ErrorMsg = "ERROR 0003: Order Items could not be inserted";       
     }  
     } 
     else 
     { 
      $this->ErrorMsg = "ERROR 0002: Order could not be inserted/updated";    
     } 


     if($DoCommit)   
     { 
     if(ibase_commit($this->dbtrans)) 
     { 
      $OrderResult = true; 
     } 
     else 
     { 
      ibase_rollback($this->dbtrans);   
      $this->ErrorMsg = "ERROR 0004: DB Qry Commit Error";  
      print $this->ErrorMsg ; 
     }   
     } 
     else 
     { 
     ibase_rollback($this->dbtrans); 
     } 
    } 
    catch(Exception $e) 
    { 
     ibase_rollback($this->dbtrans); 
     $this->ErrorMsg = "ERROR 0001: DB Exception: " . $e;  
    }   
    ibase_close($this->dbconn);  
} 

それは素晴らしいだろう。または、誰もInterbaseを使用しない場合、どのようにMySQLでそれを行いますか?私はテーブルのロック、タイムスタンプのルートを下に行きたくない。

おかげ レイ

答えて

0

あなたはそれを避けるために、主キーを使用する必要があります。ジェネレータを使用して各注文の一意のIDを取得できます。

関連する問題