2017-03-07 104 views
0

我想知道是否有辦法部分提交事務。我在C#中有一個長時間運行的事務,並且當兩個用戶並行運行這個事務時,這些數據是相互依賴的,即使在事務中也應該顯示給他們。例如說我有這3列的表格部分提交MySQL事務?

用戶名| left_child | right_child

我正在製作一棵二叉樹,每當一個新用戶被添加到數據庫中時,它們就會到達樹中的某個地方。但是我在一個事務中運行了所有的插入和更新操作,所以如果有一個錯誤,整個事務可以被回滾,樹的結構也不會受到干擾。但問題是兩個用戶同時使用我的Web應用程序的時間。 說用戶名'jackie_'在一分鐘內沒有任何孩子。兩個新用戶'king_'和'robbo'彼此並行進行,並且兩個用戶正在進行交易。由於爲一個用戶運行的事務的結果在實際數據庫中對其他用戶不可見,所以他們都認爲'jackie_'的left_child尚未設置,因此他們都將left_child更新爲他們自己的用戶名。在交易過程中,因爲更新對他們都是成功的,他們都提交交易。現在我有兩個用戶,但其中只有一個用戶實際上已成功進入樹中,並且樹的結構完全受到干擾。

所以我需要的是即使在「部分」期間也能夠提交一個事務。因此,如果'robbo'首先設置了'jackie_'的left_child,則事務將更改實現到數據庫中,所以當'king_'嘗試更新同一行時,他不能。但是,如果一路上,如果'robbo'出現其他問題,我仍然希望能夠回滾整個交易。任何其他更實用的解決方案也會受到讚賞。

對於我運行的所有查詢,這是我做的交易方式

 string insertTreesQuery = "INSERT INTO tree (username) VALUES('king_')"; 
     MySqlCommand insertTreesQueryCmd = new MySqlCommand(insertTreesQuery , con); 
     insertTreesQueryCmd.Transaction = sqlTrans; 
     insertTreesQueryCmd.ExecuteNonQuery(); 

其中sqlTrans是我使用的所有MySqlCommand對象的交易執行它們

+1

不,你不能這樣做。你必須找出解決這個問題的另一種方法。 –

回答

1

你所問的是不可能的。您不能「部分」提交交易。我假設你的例子大大簡化了,因爲你提到的交易非常大。在這種情況下,最好將其分解爲可以獨立承諾的較小的那些,從而減少發生衝突的可能性。

+0

我最終將事務拆分爲多個較小的事務,它確實解決了我的問題。它只是減少了衝突的可能性,但是當樹變大並且更加擴展並且發現葉節點在每個事務中需要越來越多的時間時,由於它必須是完整的樹,未來仍然有可能發生衝突。但是,它仍然解決了當前的問題,我可以做出更多的調整,以進一步減少衝突的可能性,所以謝謝。 –