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