2011-02-23 122 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