在我們的應用程序(使用PostgreSQL引擎(當前爲9.1,移動到9.2)時,我們在處理某些請求時插入(或更新)和更新一個特定行 因此,喜歡:當應用程序觸發約束觸發器時進行微調
BEGIN
INSERT(pg), UPDATE(java)
XOR
UPDATE(pg), UPDATE(java)
COMMIT
(遊行的Postgres和Java之間的劃分,Postgres的獲取和插入/更新所能,(其它列NULL),返回控制到Java應用程序,並更新剩餘的列)
不幸的是,我們在應用程序中發現了一個設計缺陷,在部分提交後可能導致數據不一致(特別罕見的情況下,多年來只有一次發生)。 更具體地說,如果columnA ='someConstant',columnB在COMMIT後不能爲NULL(但可以在第一次插入/更新之後,第二次更新之前!)。
在重新設計應用程序時,我們必須提供一些短期的解決方法來防止這種情況發生。
我目前在玩所謂的CONSTRAINT TRIGGER。它們可以在COMMIT之前被DEFERRED,並且它們可以執行任意檢查和RAISE EXCEPTION(這很好,因爲事務將被正常回滾)。 問題是我有(INSERT,UPDATE)或(UPDATE,UPDATE)語句。正如我所說,上述不一致的列在中間有效,但在交易結束時有效。所以這是一個竅門:觸發器應該只針對第二條語句觸發。我正在挖掘文檔,找到每行和每個語句。這並沒有幫助,因爲他們兩個都會觸發兩次,但我必須僅僅觸發第二個UPDATE語句。
任何想法?