【问题标题】:How can i manage multiple method calls as one transaction我如何将多个方法调用作为一个事务管理
【发布时间】:2016-02-03 06:54:09
【问题描述】:

我在为我的 REST API (JAVA) 建立事务管理器/范围时遇到问题,我的 API 后端中有以下函数,我想将以下所有函数作为一个事务执行,

  1. 调用第三方 WS 端点
  2. 解密响应
  3. 将响应保存到 DB1
  4. 将响应保存到 DB2

我想确保上述所有步骤都完成或在任何一个失败时回滚,我有足够的信息来进行回滚,但我不知道实施适当的事务管理机制的最佳实践是什么,因为上面提到了每个 API 调用的步骤发生在 3 个单独的类中,
这是我的类结构的伪代码

class CallWS {
public People callThWS() {
  // functions related to call third party WS and decryption (step 1,2)
 }
}

class People peopleServices {  
   public People getPeopleData() {
        callThWS ppl= new callThWS();
        People pplObj = ppl.callThWS(); 
        // save to DB1, (step 3)
        return pplObj;
   }
}

class People peopleContr {
 public People getAllPeople() {
    peopleServices ppSer= new peopleServices();
    People pplObj2 =  ppSer.getPeopleData();
    // save to DB2, (Step 4)
    return  pplObj2; 
 }
}

请帮助我,
谢谢

【问题讨论】:

    标签: java api rest transactions transactionscope


    【解决方案1】:

    您需要的是分布式事务(XA)。检查支持 XA 的各种事务管理器的示例。查看this 文章,了解在独立应用程序中使用 XA 提供程序(警告:旧文章)。

    【讨论】:

      【解决方案2】:

      如果您控制列出的所有类的源代码,并且可以以拥有单一入口点的方式重构代码,则可以很容易地做到这一点,除了调用外部 Web 服务。伪代码如下。

      在这里,我们应该同意您在方法中调用的所有资源都是事务性的。正如我之前提到的,对外部 WS 的调用不属于该类别,因为对外部 Web 服务的调用本质上不是事务性的。同样,如果您不通过调用外部服务来更改数据,您可以考虑将其留在事务之外。你还是有一点控制力的。就像在对外部服务的调用不成功的情况下回滚事务一样,并且只要您在另一端没有更改任何内容,您可能并不关心在那里回滚事务。

      但是,您仍然可以选择一些选项来对外部 WS 调用(如 Web Services Atomic Transactions)进行事务调用,但我敢打赌,您需要控制源,甚至可能需要控制另一端的环境。在这种幸运的情况下,您宁愿通过避免调用 WS 来实现它。

      class RestAPIEntryPointResource {
          @Inject
          CallWS callWS;
      
          @Inject
          PeopleServices peopleServices ;
      
          @Inject
          PeopleContr peopleContr;
      
       /*Put some transaction demarcation here. 
      If your class is an EJB, it is already done for you. 
      With Spring you have various options to mark the method transactional. 
      You also may want to take a manual control, but it look redundant here. */
          public void entryPointMethod() {
              callWS.callThWS();
              peopleServices.getPeopleData();
              peopleContr.getAllPeople();
          }
      }
      
      class CallWS {
          public People callThWS() {
              // functions related to call third party WS and decryption (step 1,2)
          }
      }
      
      class PeopleServices {
          public People getPeopleData() {
              ..........
          }
      }
      
      class PeopleContr {
          public People getAllPeople() {
              .........
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 2013-11-30
        • 2013-12-01
        • 2015-07-17
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多