0

いつでもプログラムの複数のインスタンスによって実行される可能性のある次のシーケンスがあります。

ステップ 1:請求書が未払いかどうかを確認する

ステップ 2:請求書が未払いの場合は、請求書を支払済としてマークする

プログラムのインスタンス 1 とインスタンス 2 の両方がほぼ同時にステップ 1 を実行し、両方がステップ 2 に進むのではないかと心配しています。これを防ぐにはどうすればよいですか?

4

2 に答える 2

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 に答える
0

(シリアル化可能) を使用しTRANSACTIONます。詳細は、データベース プラットフォームによって異なります

詳細については、 http://en.wikipedia.org/wiki/Database_transactionを参照してください

于 2012-08-17T08:35:26.170 に答える