0

我有以下序列,可以在任何时候由我的程序的多个实例执行:

第 1 步:查看账单是否未付

第 2 步:如果账单未支付,则将账单标记为已支付

我担心我的程序的实例 1 和实例 2 几乎同时执行第 1 步,因此继续执行第 2 步。我怎样才能防止这种情况发生?

4

2 回答 2

0

使用 (可序列化) TRANSACTION。更多详细信息取决于您的数据库平台

有关详细信息,请参阅http://en.wikipedia.org/wiki/Database_transaction

于 2012-08-17T08:35:26.170 回答
0

不看代码很难具体说明这一点,但显而易见的方法是将步骤 1 和 2 结合起来。

所以,而不是:

$invoice_status = call_database(
select INVOICE_STATUS
from   INVOICES
where  INVOICE_ID = $invoice_id)

if ($invoice_status = UNPAID){
   call_database (
      UPDATE INVOICES 
      SET INVOICE_STATUS = PAID 
      WHERE INVOICE_ID = $invoice_id)
}

你会做类似的事情

call_database(
   update invoices
   set    invoice_status = PAID
   where  invoice_id = $invoice_id
   and    invoice_status = UNPAID)
于 2012-08-17T09:19:26.857 回答