2016-01-21 49 views
2

我運行了幾個並行進程,每個進程都有一個打開連接到firebirdSQL數據庫的進程。一個進程將趕上張貼由火鳥一個更新事件:在AFTER UPDATE事件上在不同連接上接收不同的數據

SET TERM^; 

CREATE TRIGGER CM_ARTIKEL_AU FOR ARTIKEL 
ACTIVE AFTER UPDATE 
POSITION 0 
AS 
BEGIN 
    /* Trigger body */ 
    Insert into CM_ARTIKEL_CHANGES(
    "TYPE", 
    ARTNR 
) 
    values (
    'UPDATE', 
    old.ARTIKELNR 
); 

    POST_EVENT 'UPDATE_ARTICLE'; 
END^ 

SET TERM ;^

場景:

過程捕獲一個AFTER_UPDATE事件,並經由RabbitMQ的過程Ç有關的數據集,以通知檢查。

過程執行select語句,並檢索更新的數據。一切安好。

過程Ç執行select聲明,並檢索OLD數據,在執行更新之前!

任何建議爲什麼?

+0

進程C使用具有在更新完成之前啓動的隔離級別快照的事務?您在執行這些檢查時需要啓動新的事務,或者確保使用讀取已提交的事務(根據應用程序的不同,它可能有其缺點)。 –

回答

1

通常,當您看到舊數據時,您正在使用具有隔離級別快照(又名併發)的事務,該事務在提交數據更改之前啓動。

您需要確保當進程C查詢數據以響應通知時,它會結束(提交)舊事務並啓動新事務以獲取更新的數據。

另一種方法是使用隔離級別讀取已提交的事務,但這可能會有其缺點,具體取決於應用程序的功能。

+0

我忽略了對事務執行讀操作(作爲寫操作)。如果它解決了我的問題,我會接受答案。 –

+0

@TinoRüb在Firebird中總是有必要的事務,有些驅動程序通過在需要時啓動事務來隱藏這一事實,並且如果驅動程序默認情況下不使用自動提交,那麼您可能會進行長期的事務處理,這可能導致到不可見的更新並可能導致與舊版記錄版本的「垃圾」相關的性能問題,這些舊版記錄版本需要保留用於長時間運行的事務。 –

+0

當沒有聲明事務時,PHP驅動程序似乎不會自動啓動事務。至少這些「自動事務」不包括在firebird跟蹤日誌輸出(?)中。通過完整的事務管理,它現在可以按預期工作! (:函數ibase_blob_open()導致的事務處於打開狀態並導致問題。 –

相關問題