いつでもプログラムの複数のインスタンスによって実行される可能性のある次のシーケンスがあります。
ステップ 1:請求書が未払いかどうかを確認する
ステップ 2:請求書が未払いの場合は、請求書を支払済としてマークする
プログラムのインスタンス 1 とインスタンス 2 の両方がほぼ同時にステップ 1 を実行し、両方がステップ 2 に進むのではないかと心配しています。これを防ぐにはどうすればよいですか?
いつでもプログラムの複数のインスタンスによって実行される可能性のある次のシーケンスがあります。
ステップ 1:請求書が未払いかどうかを確認する
ステップ 2:請求書が未払いの場合は、請求書を支払済としてマークする
プログラムのインスタンス 1 とインスタンス 2 の両方がほぼ同時にステップ 1 を実行し、両方がステップ 2 に進むのではないかと心配しています。これを防ぐにはどうすればよいですか?
コードを見ずにこれを具体化するのは難しいですが、これを行う明白な方法は、ステップ 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)
(シリアル化可能) を使用しTRANSACTION
ます。詳細は、データベース プラットフォームによって異なります
詳細については、 http://en.wikipedia.org/wiki/Database_transactionを参照してください