3

我想在下面的方式在2層WPF使用事務處理(或Windows窗體)應用:長期生活交易是否可以接受?

當我們打開新的形式的數據編輯,編輯和在本次交易透明持續變化,我們可以開始新的事務。然後我們可以點擊「確定」按鈕並提交事務,或者「取消」按鈕並回滾它。如果我們想用這些數據打開另一個對話窗口,我們可以使用嵌套事務。

問題是:這種使用交易的方式是否可以接受?我知道有很多不同的方法來實現這樣的邏輯,但我想列舉這個優點和缺點。

回答

6

這裏,如果你走這條路

  • 連接時可能遇到的重置/關閉/ 超時(如果用戶去衛生間)
  • 數據庫配置(數據庫有幾個問題主要是爲很多短交易預先配置,而不是長期交易,例如跟蹤tx期間所做的操作的撤消日誌可能需要調整)
  • 問題,甚至mayb e交易死鎖(交易時間越長,相同鎖定獲得兩次的可能性就越大)。

這是一種不鼓勵的做法。改爲使用樂觀鎖定。必要時讀取數據,將內容保存在內存中。當關閉對話框時,嘗試將更改與數據庫同步。如果兩者之間的數據庫中的數據已被修改,則操作將中止。它失敗的可能性取決於用戶的數量等等。但在實踐中這是經常可以接受的。

4

長時間運行交易將嚴重影響您的擴展能力。

我會盡量避免。

正如其他人所指出的,在等待用戶輸入時,您不應該保持事務處於打開狀態。

+0

請問downvoter請留言。謝謝。 – 2009-12-28 13:28:56

2

不,在等待用戶輸入時不要保持事務處於打開狀態。這是不好的設計,並會導致事務資源(數據庫)的鎖定問題。

您需要重新考慮您的方法。爲什麼你會在用戶填寫表單時打開交易?我們使用事務來管理併發和鎖定共享資源。填寫表格並不具備真正的資格。

2

我同意Mitch n Cheeso,但仍然有一種將Timeout放在窗口上的方法,您可以通知一個時鐘,如果用戶沒有按下「OK」,那麼窗口會自動關閉,一切都會取消。

大多數交易非常關鍵的系統,例如航空公司,電影等的「預訂」流程,運營商應該在有限的時間內完成交易。

+0

關於可用性:如果有東西被保留(例如一張票)並且必須在超時後被釋放,那麼窗口上的時鐘是可以接受的。即使這樣,不要關閉它(用戶不知道發生了什麼),只要發出一條消息並給用戶一個按鈕,以便在可能的情況下重新保留。但如果你不在這樣一個系統中工作,樂觀鎖定策略要好得多。讓用戶隨時需要,並且除非實際存在問題,否則不要取消表格。 – benzado 2010-01-05 20:28:18

+0

我同意,給予altert重新打開窗口是附加功能,這是UI插件,但關閉是必要的,因爲如果用戶離開一些其他任務,或網絡卡住,數據庫將不必要的鎖定和其他一些用戶可能會遭受,所以它對於在預訂系統中關閉交易非常重要。 – 2010-01-06 10:50:03

9

長期生活交易是學術界圍繞...... 20世紀80年代熱點討論的話題。問題在於,長期存在的交易幾乎肯定會導致悲觀執行中的僵局,並且幾乎肯定需要在樂觀執行中解決複雜的衝突解決方案(對於數字,您可以參考Jim Gray's paper "The Dangers of Replication and a Solution",但不久之後死鎖會隨着交易規模的五次冪而上升,並且碰撞的概率隨着第二次冪增加)。

現在有不同的提案來解決這個問題,比如Salem和Garcia-Molina的"sagas",「嵌套交易」等等(another Jim Gray's paper "The Transaction Concept: Virtues and Limitations"最後有幾頁介紹)。大多數提案涉及交易模式,弱於ACID。例如,「長交易」可能不得不公開其中間結果,這違反了隔離屬性。但是沒有任何一個提案對於這個行業頗具影響力,可以這麼說。主要是因爲這些技術不是真的......簡化,也沒有必要解決實際的業務問題。

因此,要回答您的問題:不,在主流數據庫引擎中不歡迎長期生活的交易。

相關問題