我有以下序列,可以在任何时候由我的程序的多个实例执行:
第 1 步:查看账单是否未付
第 2 步:如果账单未支付,则将账单标记为已支付
我担心我的程序的实例 1 和实例 2 几乎同时执行第 1 步,因此继续执行第 2 步。我怎样才能防止这种情况发生?
我有以下序列,可以在任何时候由我的程序的多个实例执行:
第 1 步:查看账单是否未付
第 2 步:如果账单未支付,则将账单标记为已支付
我担心我的程序的实例 1 和实例 2 几乎同时执行第 1 步,因此继续执行第 2 步。我怎样才能防止这种情况发生?
使用 (可序列化) TRANSACTION
。更多详细信息取决于您的数据库平台
不看代码很难具体说明这一点,但显而易见的方法是将步骤 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)