2011-02-23 124 views
1

場景:TransactedReceiveScope - 交易提交何時完成?

我們有一個wcf工作流程,其客戶端不使用事務流。 工作流程包含幾個連續的TransactedReceiveScopes(使用基於內容的關聯)。 TransactedReceiveScopes包含自定義數據庫操作。

觀察:

當我們對運行在第一次調用SQL事件探查器中,我們看到所有的自定義調用數據庫,並且在配置文件跟蹤的SaveInstance電話。

我們已經注意到,即使SendReply在TransactedReceiveScope的最後,有時候sendreply在事務提交之前發生了10秒。

我們嘗試將TimeToPersist和TimeToUnload更改爲零,但這沒有效果。 (跟蹤顯示SaveInstance立即發生,但是提交似乎被延遲)。

問題:

是我們的意見,是否正確?

交易在什麼時候進行?這是否像垃圾回收 - 即它在一段時間後不忙時提交?

是否有任何方法來控制提交延遲,或者是唯一的方法來做到這一點使用來自客戶端的事務流(然後它應該都提交時,客戶端提交,包括堅持)。

回答

1

TransactedReceiveScope在主體完成時提交事務,但所有執行都是通過調度程序完成的,可能會稍後。它與垃圾收集無關,並且沒有真正的方法來影響垃圾收集,以避免繁忙的機器和許多其他並行活動,這些活動也可能在執行隊列中。

+0

謝謝莫里斯。我仍然覺得奇怪的是,你看到了profiler中的所有SQL調用,包括saveinstance,然後它返回給客戶端,但是在它提交之前還有一段時間的延遲。我需要閱讀調度程序,我沒有看到太多的提及。唯一的解決方案似乎是使用客戶端的TransactionFlow來控制事務的提交,即使客戶端沒有自己的工作來添加到事務中。 – jimasp

+0

閱讀此文的任何人的另一點是,如果您的客戶端沒有將事務處理流入工作流程,那麼在大多數情況下,您只需要一個標準的receive/sendreply處理中間的transactioncope。 – jimasp