全部产品
云市场

发起方

更新时间:2020-03-13 12:29:40

分布式事务的发起方负责启动分布式事务,通过调用参与者的服务,将参与者纳入到分布式事务当中,并决定整个分布式事务是提交还是回滚。一个分布式事务有且只能有一个发起方。

跨服务参与者 RPC 订阅

对于发起方的应用来说,如果参与者与发起方分别属于不同的应用,则发起方需要订阅参与者 RPC 服务。

跨服务 TCC 参与者服务订阅

  • 基于 SOFARPC 发布的服务订阅

    1. <sofa:reference id="tccAction" interface="com.xxx.xxx.TccAction">
    2. <sofa:binding.tr />
    3. </sofa:reference>
  • 基于 Dubbo 发布的服务订阅

    1. <dubbo:reference id="tccAction" interface="com.xxx.xxx.TccAction" />

跨服务 FMT 参与者服务订阅

  • 基于 SOFARPC 发布的服务订阅

    1. <sofa:reference id="dataServiceSofaRpc" interface=com.xxx.DataService" >
    2. <sofa:binding.tr />
    3. </sofa:reference>
  • 基于 Dubbo 发布的服务订阅

    1. <dubbo:reference id="dataServiceDubbo" interface=com.xxx.DataService" />

开启分布式事务

  • 为需要开启分布式事务的接口增加分布式事务注解 @DtxTransaction(com.alipay.sofa.dtx.client.aop.annotation.DtxTransaction),表明此方法内部需要开启分布式事务。

    注意:该注解需放在方法实现之前。

  • 方法内部可以执行下列事务操作(无数量与先后顺序的限制):
    • 操作本地 FMT 参与者的 DAO 操作。
    • 调用本地 TCC 参与者的第一阶段 Try 方法调用。
    • 调用基于 SOFARPC 或 Dubbo 发布的普通服务,该服务内再操作 FMT 参与者,跨服务 FMT 参与者。
    • 调用基于 SOFARPC 或 Dubbo 发布的跨服务 TCC 参与者的第一阶段 Try 方法。

业务方法正常返回则分布式事务提交,业务方法抛出异常则分布式事务回滚。

示例如下:

  1. public class YourClass {
  2. @DtxTransaction(bizType="yourbizType")
  3. public void yourMethod(yourParams){
  4. try{
  5. //可以是 FMT 参与者数据源
  6. DAO1;
  7. DAO2;
  8. ......
  9. DAO N;
  10. // 调用 TCC 参与者一阶段try方法,try方法第一个参数值传'null';
  11. TCC.try();
  12. // 普通 rpc 调用,在该调用方法内可以访问 FMT 参与者数据源
  13. dataServiceSofaRpc.method();
  14. // 方法正常返回,事务提交
  15. }catch(Throwable t){
  16. // 出现异常,事务回滚
  17. throw t;
  18. }
  19. }
  20. }

注意,该方法所在类需要配置成 Spring Bean,这样才能被分布式事务扫描器识别。

@DtxTransaction 注解属性说明:

  • bizType:必选项。该属性指定业务类型,由用户根据自己业务场景自定义,长度不超过 30 字符。
  • timeout:该属性指定事务超时时间,默认为 30 秒,用户可以根据自身需要自定义,单位为秒。

    注意:超时会自动触发当前事务回滚。

  • isolationLevel:该属性指定分布式事务的隔离级别,默认是为 READ_UNCOMMITTED(读未提交)。目前只支持 READ_UNCOMMITTED(读未提交)和 READ_UNCOMMITTED(读已提交)两种隔离级别,用户可按需配置。

发起方类配置 Bean

要让 Spring 框架扫描发起方的注解,需要让 Spring 框架感知到发起方的 Bean,以上述“YourClass”为例:

  1. <bean id="yourClassBean" class="com.xxx.xxx.YourClass" />