【发布时间】:2012-08-17 08:32:34
【问题描述】:
我有以下序列,可以在任何时候由我的程序的多个实例执行:
第 1 步:检查账单是否未付
第 2 步:如果账单未付,则将账单标记为已付
我担心我的程序的实例 1 和实例 2 几乎同时执行第 1 步,因此继续执行第 2 步。如何防止这种情况发生?
【问题讨论】:
标签: database concurrency
我有以下序列,可以在任何时候由我的程序的多个实例执行:
第 1 步:检查账单是否未付
第 2 步:如果账单未付,则将账单标记为已付
我担心我的程序的实例 1 和实例 2 几乎同时执行第 1 步,因此继续执行第 2 步。如何防止这种情况发生?
【问题讨论】:
标签: database concurrency
使用(可序列化的)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)
【讨论】: