none
请高手帮忙:BizTalk WCF_Custom适配器sqlBinding事务问题 RRS feed

  • 问题

  • 我的Orchestration想实现如下的功能:
    1. 一个接收端口(ReceivePort),两个发送端口(SendPort-A,SendPort-B),都通过WCF_Custom适配器的sqlBinding
    2. 执行的操作是从ReceivePort端口获取数据,Insert到SendPort-A和SendPort-B中
    2. SendPort-A,SendPort-B绑定到本机的不同数据库 ,useAmbientTransaction = true
    3. 该Orchestration的所有操作都在一个原子的事务作用域 中,使用了默认的事务补偿。

    在正常的情况下,该Orchestration能执行成功,结果是我预想的那样。但是,如果SendPort-A或者SendPort-B中的任何一个出现异常或者端口发送错误,则另一个不会进行回滚,我想知道如何才能做到回滚 ?
    2009年12月16日 4:22

答案

  • Hi

        你这样做是实现不了的。解决办法是通过存储过程去操作两个数据库的操作达到事务效果。因为BizTalk中的事务操作仅局限在BizTalk自身的数据。其他第三方的事务操作无法实现。因为它根本就不知道怎么回滚。或者你只能在Orchestration中加异常补偿来手动解决,但这样的话你也必须要知道目标数据库该如何回滚。

    • 已标记为答案 Allen Zeng 2009年12月28日 2:45
    2009年12月28日 1:18

全部回复

  • 请大师们指点指点啊,如何才能确保右边的两个接收端口要么同时成功要么回滚 成功的操作,流程图如下:

    2009年12月16日 6:15
  • 你提供的流程是个并行操作,并行操作是同时执行的,这种情况下要想回滚可以考虑先捕获错误然后在补偿里进行。。。

    2009年12月21日 13:47
  • 不明白,可否说的详细点。
    补偿还需要自己来写代码处理吗?
    2009年12月23日 6:11
  • Hi

        你这样做是实现不了的。解决办法是通过存储过程去操作两个数据库的操作达到事务效果。因为BizTalk中的事务操作仅局限在BizTalk自身的数据。其他第三方的事务操作无法实现。因为它根本就不知道怎么回滚。或者你只能在Orchestration中加异常补偿来手动解决,但这样的话你也必须要知道目标数据库该如何回滚。

    • 已标记为答案 Allen Zeng 2009年12月28日 2:45
    2009年12月28日 1:18