簡體   English   中英

如何防止數據庫更新的並發問題?

[英]How to prevent concurrency issue with database update?

我有以下序列,可以隨時由我的程序的多個實例執行:

步驟1:檢查帳單是否未付款

步驟2:如果未付帳單,則將帳單標記為已付

我擔心我的程序的實例1和實例2幾乎都同時執行步驟1,因此都繼續執行步驟2。如何防止這種情況發生?

使用(可序列化的) TRANSACTION 更多詳細信息取決於您的數據庫平台

有關詳細信息,請參見http://en.wikipedia.org/wiki/Database_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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM