2017-06-11 126 views
1

我看到另一個數據庫系統提供暫停transaction。當前的事務保持不變,但是當你的代碼被允許與數據庫一起工作時,這些事務就會暫停,直到永久更改行。然後,您可以恢復交易,繼續保持原有的鎖定和其他交易保護位置,就好像您永遠不會中斷它一樣。在Postgres中掛起交易

例如,假設客戶在交易中下訂單。在該交易期間,客戶通知他們的電話號碼需要更新,因此我們更改了這些數據。接下來,客戶決定取消尚未完成的訂單。訂單的回滾意味着還會撤消電話號碼更改。所以,如果我們能夠這樣做會很好:

  1. 暫停訂單的交易。
  2. 更新提交給數據庫的電話號碼。
  3. 恢復訂單的交易。

有沒有辦法暫停Postgres的交易?在JDBC

+0

有趣的問題......並感謝我的答案非常有幫助編輯! – GhostCat

回答

1

如果事務無法繼續,它必須回滾。

如果你的交易有一點你不知道如何繼續下去,那麼你的交易邏輯是有缺陷的,你需要重新組織它 - 要麼拆分成多個交易(或子交易,又稱保存點) ,或者取出不屬於事務邏輯的部分。

有沒有辦法在Postgres中暫停交易?

不,沒有這樣的事情。數據完整性原則在時間上是無條件的。

0

解決方法 - 打開第二個連接

在JDBC中,你可以只打開一個到數據庫的第二個連接。

對第二個連接進行單獨的工作並關閉。第一個連接仍處於打開狀態並保持其狀態。該第一個連接中的任何活動事務都保留。

+0

當第二個事務需要執行第一個事務鎖定的事情時,這經常會遇到死鎖,從而無法繼續。只有當這兩個交易之間沒有依賴關係時纔會發生這種情況,但這意味着您的第一筆交易是錯誤的,因爲它試圖做一些本來不應該做的事情。數據庫設計問題的解決方法通常是一個壞主意。 –

+0

@ vitaly-t我在問題中添加了一個示例場景。以txn開始客戶訂單,作爲我們決定更新電話號碼的附註,然後客戶取消新但未完成的訂單。當我們回滾訂單時,我們無意中還回滾了電話號碼。你提到的是一個設計問題嗎?看起來像是一個合法的問題和解決方案,但我很樂意聽到另一個立場。 –

+1

您的示例將業務事務與數據庫事務混淆。這是兩個完全不同的東西。 –