Как использовать транзакции Interbase с PHP? - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть сайт PHP, подключенный к базе данных Interbase.БД содержит заказы, которые пользователи могут загружать и отображаются на экране.Пользователь может вносить изменения в заказ и сохранять их.Это работает, но если 2 пользователя загружают и сохраняют одну и ту же запись, тогда порядок содержит изменения, сделанные последним пользователем, который сохранил.

Когда второй пользователь пытается сохранить, я хочу, чтобы всплыло сообщение о том, что заказ был изменен, и остановка сохранения заказа.

Я знаю, что у interbase есть транзакции, которые делают это какУ меня есть настольное приложение, которое реализует транзакции и описанный выше сценарий.Однако я не знаю, как сделать то же самое с PHP в веб-среде.

Настольное приложение постоянно поддерживает базу данных, а транзакция сохраняется с момента ее прочтения до подтверждения.В PHP БД и транзакция открываются / создаются только при выполнении каждого запроса.Из того, что я прочитал, транзакция откатывается в конце скрипта, если он не зафиксирован.

Код загрузки заказа

Код 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);   
}  

Сохранение кодаorder

Код 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?Я не хочу идти по столу, блокируя маршрут с отметкой времени.

Спасибо, Рэй

1 Ответ

0 голосов
/ 17 апреля 2011

Вы должны использовать первичный ключ, чтобы избежать этого.Вы можете использовать генератор, чтобы получить уникальный идентификатор для каждого заказа.

...