2016-10-24 59 views
0

我正在執行包含在CMSTransactionScope中的數據導入。Kentico事務和數據回滾

什麼是最有效和實用的方式來並行導入數據並回滾如果有任何錯誤?我看到的問題是,它是平行的,我不知道如果插入的對象是事務的一部分,如果它們是新線程的一部分。

有沒有辦法做到這一點或應該以不同的方式處理?

回答

1

如果您爲了獲得更好的性能而並行運行代碼,並且基本上是逐行插入行,那麼它在執行單個線程時不太可能執行得更好。 在這種情況下,我建議使用一個線程與CMSTransactionScope,並可能ConnectionHelper.BulkInsert。不管怎麼說,如果你仍然想並行運行你的查詢,那麼你需要實現某種同步(例如鎖定),以確保所有語句在代碼命中前執行(這基本上意味着性能損失)。否則,查詢將在單獨的事務中執行。此外,您必須確保CMSTransactionScope對象始終使用相同的IDataConnection進行實例化(當您未將連接傳遞給構造函數時,這會在默認情況下發生)。

第二種方法似乎容易出錯,我和我寧願看看優化代碼的方式(使用異步等)

+0

我可以肯定地理解和對第一種方法同意你的看法插入數據。 如何更新數據?例如,有一個事務處理器,然後循環並行地逐行更新行?我想知道這是否可能?或者,因爲每個線程都有一個新的連接範圍,kentico sql update查詢只是死鎖?也許我正在想這個.. – user1740075

+0

如果你做'CMSTransactionScope'內的'Parallel.ForEach()'我相信應該沒有任何死鎖。事務範圍使用自己的連接作用域,我希望即使在使用多線程時也會被重用。不過,我認爲如果有的話,性能增益會很小。找出最好的方法是繼續嘗試它:) – rocky