[英]How can I make sure two simultaneous pl/sql transactions wait on each other or are aware of the other
我有一個等待服務響應的程序包。 它正在為用戶處理地址,對於給定的順序,地址可能在1到3之間。 我需要根據兩個條件執行一些邏輯:
由於這是異步的,因此我可能會獲得包含3條記錄的訂單,所有記錄都在同一時間處理。 每個返回記錄將導致表上一行的列被更新,並且在處理完最后一條記錄后,我還將更新“准備導入”列。 因此,目前,我的邏輯檢查以查看是否已針對它處理的每個記錄更新了所有預期的列。 想法是,隨着每條記錄的更新,它是自己的列,在對另一條記錄的每次檢查時,我都會看到所有必需的列都已更新,這意味着所有記錄都已處理,然后我可以更新最后一個“ READY TO IMPORT”列。
我發現某些記錄集基本上仍在同時發生,因此它們各自都在尋找要更新的其他記錄列,但發現沒有更新,因此“准備導入”列永遠不會更新,即使所有記錄都已處理。 或者至少這是基於測井告訴我的最佳理論。
我不是在每條記錄當前更新其分配的列之后立即執行提交-所以我想知道是否在更新表之后立即添加提交會有所幫助。
因此,除此以外,我還在尋找其他選擇。 我可以提出一些建議,例如在特定記錄上添加等待,以便更有可能總是最后一次處理,或者添加一個清理過程來查找所有必要列均已更新但沒有的情況“准備導入”更新,並進行相應更新(基本上是發生此問題時的回退)
但是我必須認為有一種內置的方法可以做到這一點。 我們使用的是Oracle 12c。 我一直在查看並發提交,但是從閱讀文檔來看,這對我來說是一個好的還是明智的解決方案,目前尚不清楚。
如果有幫助,則邏輯如下所示:
// code to update relevant column on order_table
...
//check if all columns have been updated on each instance of the logic running
IF all_oracle_ids_resolved(v_header_id, v_destination_contact_id) THEN
v_debug_progress := v_debug_progress || 'START UPDATE ORDER_TABLE TO READY TO IMPORT' || CHR(13);
UPDATE order_table
SET order_status = 'READY TO IMPORT',
up_last_updated_by = -2,
up_last_update_date = SYSTIMESTAMP
WHERE header_id = v_header_id;
END IF;
以及它調用的功能:
FUNCTION all_oracle_ids_resolved(p_header_id NUMBER,
--send in p_destination_contact_id to identify whether or not a destiantion address exists on the order
p_destination_contact_id VARCHAR2) RETURN BOOLEAN IS
v_dummy_cnt NUMBER := 0;
BEGIN
SELECT count(*)
INTO v_dummy_cnt
FROM ORDER_TABLE
WHERE header_id = p_header_id
--check that all head address Oracle data exists
AND (head_customer_id IS NOT NULL AND head_contact_id IS NOT NULL)
--check that all ship address Oracle data exists
AND (ship_customer_id IS NOT NULL AND ship_contact_id IS NOT NULL AND ship_site_use_id IS NOT NULL)
--check that all bill address Oracle data exists
AND (bill_customer_id IS NOT NULL AND bill_contact_id IS NOT NULL AND bill_site_use_id IS NOT NULL)
--check that all dest address Oracle data exists, unless there is no destination address to verify
AND ((dest_customer_id IS NOT NULL AND dest_contact_id IS NOT NULL AND dest_site_use_id IS NOT NULL) OR (p_destination_contact_id IS NULL));
IF v_dummy_cnt > 0 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END all_oracle_ids_resolved;
我的期望是對order_table的更新僅在處理完所有記錄后才會發生。 當需要處理1-3個異步事務之間時,該如何實現?
如評論所述,使用SELECT .. FOR UPDATE解決了對原始帖子的回復
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.