发起方配置
分布式事务的发起方负责启动分布式事务,通过调用参与者的服务,将参与者纳入到分布式事务当中,并决定整个分布式事务是提交还是回滚。一个分布式事务有且只能有一个发起方。
跨服务参与者 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 注解属性说明如下表所示。
参数 | 说明 |
---|---|
bizType |
必选项。该属性指定业务类型,由用户根据自己业务场景自定义,长度不超过 30 字符。 |
timeout |
该属性指定事务超时时间,默认为 30 秒,您可以根据需要自定义,单位为秒。 超时会自动触发当前事务回滚。 |
isolationLevel |
该属性指定分布式事务的隔离级别,默认是为 READ_UNCOMMITTED (读未提交)。目前只支持 READ_UNCOMMITTED (读未提交)和 READ_COMMITTED (读已提交)两种隔离级别,可按需配置。 |
发起方类配置 Bean
要让 Spring 框架扫描发起方的注解,需要让 Spring 框架感知到发起方的 Bean,以上述“YourClass”为例:
<bean id="yourClassBean" class="com.xxx.xxx.YourClass" />