分布式事务的发起方负责启动分布式事务,通过调用参与者的服务,将参与者纳入到分布式事务当中,并决定整个分布式事务是提交还是回滚。一个分布式事务有且只能有一个发起方。
跨服务参与者 RPC 订阅
对于发起方的应用来说,如果参与者与发起方分别属于不同的应用,则发起方需要订阅参与者 RPC 服务。
跨服务 TCC 参与者服务订阅
基于 SOFARPC 发布的服务订阅
<sofa:reference id="tccAction" interface="com.xxx.xxx.TccAction"> <sofa:binding.tr/> </sofa:reference>
基于 Dubbo 发布的服务订阅
<dubbo:reference id="tccAction" interface="com.xxx.xxx.TccAction"/>
跨服务 FMT 参与者服务订阅
基于 SOFARPC 发布的服务订阅
<sofa:reference id="dataServiceSofaRpc" interface=com.xxx.DataService" > <sofa:binding.tr/> </sofa:reference>
基于 Dubbo 发布的服务订阅
<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 方法。
业务方法正常返回则分布式事务提交,业务方法抛出异常则分布式事务回滚。
示例如下:
public class YourClass{
@DtxTransaction(bizType="yourbizType")
public void yourMethod(yourParams){
try{
//可以是 FMT 参与者数据源
DAO1;
DAO2;
......
DAO N;
// 调用 TCC 参与者一阶段try方法,try方法第一个参数值传'null';
TCC.try();
// 普通 rpc 调用,在该调用方法内可以访问 FMT 参与者数据源
dataServiceSofaRpc.method();
// 方法正常返回,事务提交
}catch(Throwable t){
// 出现异常,事务回滚
throw t;
}
}
}
该方法所在类需要配置成 Spring Bean 才能被分布式事务扫描器识别。
@DtxTransaction 注解属性说明如下表所示。
参数 | 说明 |
---|---|
| 必选项。该属性指定业务类型,由用户根据自己业务场景自定义,长度不超过 30 字符。 |
| 该属性指定事务超时时间,默认为 30 秒,您可以根据需要自定义,单位为秒。 超时会自动触发当前事务回滚。 |
| 该属性指定分布式事务的隔离级别,默认是为 |
发起方类配置 Bean
要让 Spring 框架扫描发起方的注解,需要让 Spring 框架感知到发起方的 Bean,以上述“YourClass”为例:
<bean id="yourClassBean" class="com.xxx.xxx.YourClass"/>
- 本页导读 (0)