Skip to content

Commit 83c6c91

Browse files
committed
fix readme by seata tcc
1 parent cf00f1f commit 83c6c91

File tree

3 files changed

+111
-4
lines changed

3 files changed

+111
-4
lines changed

springboot-seata-tcc-sample/README.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,95 @@ Seata 事务模型包含了:TM(事务管理器),RM(资源管理器)
8888

8989
<img src="https://raw.githubusercontent.com/ipipman/JavaSpringBootSamples/master/ReadmeMaterial/32361607671705_.pic_hd.jpg" width = "700" height = "400" alt="图片名称" align=center />
9090

91+
###### Seata-TCC模式事件的核心代码简述
92+
1.TCC注册分支事务:@TwoPhaseBusinessAction注解释用于标注这是一个TCC接口,会初始化TccActionInterceptor拦截器,用于注册分支事务(Branch Transaction)
93+
```java
94+
/**
95+
* 第一个阶段:准备阶段
96+
*
97+
* @param actionContext
98+
* @param a
99+
* @return
100+
*/
101+
@TwoPhaseBusinessAction(name = "DubboTccActionOne", commitMethod = "commit", rollbackMethod = "rollback")
102+
public boolean prepare(BusinessActionContext actionContext,
103+
@BusinessActionContextParameter(paramName = "a") int a);
104+
105+
/**
106+
* 第二个阶段:提交操作
107+
*
108+
* @param actionContext
109+
* @return
110+
*/
111+
public boolean commit(BusinessActionContext actionContext);
112+
113+
/**
114+
* 第三个阶段:回滚阶段
115+
*
116+
* @param actionContext
117+
* @return
118+
*/
119+
public boolean rollback(BusinessActionContext actionContext);
120+
```
121+
122+
2.开启TCC全局事务:在Seata中TCC模式和AT模式一样,业务方需要使用@GlobalTransactional注解来开启全局事务(Global Transaction),会初始化GlobalTransactionInterceptor拦截器,开启一个全局事务,获取全局的事务ID(即RootContext.getXID())
123+
```java
124+
/**
125+
* 分布式事务提交demo
126+
*
127+
* @return
128+
*/
129+
@GlobalTransactional
130+
public String doTransactionCommit() {
131+
//第一个TCC 事务参与者
132+
boolean result = tccActionOne.prepare(null, 1);
133+
if (!result) {
134+
throw new RuntimeException("TccActionOne failed.");
135+
}
136+
List<String> list = new ArrayList<>();
137+
list.add("c1");
138+
list.add("c2");
139+
140+
//第二个TCC 事务参与者
141+
result = tccActionTwo.prepare(null, "two", list);
142+
if (!result) {
143+
throw new RuntimeException("TccActionTwo failed.");
144+
}
145+
146+
//此时两个TCC参与者的prepare方法都执行成功了,TC就会触发这两个TCC参与者的commit方法进行提交
147+
return RootContext.getXID();
148+
}
149+
150+
/**
151+
* 分布式事务回滚demo
152+
*
153+
* @param map
154+
* @return
155+
*/
156+
@GlobalTransactional
157+
public String doTransactionRollback(Map<String, String> map) {
158+
//第一个TCC 事务参与者
159+
boolean result = tccActionOne.prepare(null, 1);
160+
if (!result) {
161+
throw new RuntimeException("TccActionOne failed.");
162+
}
163+
List<String> list = new ArrayList<>();
164+
list.add("c1");
165+
list.add("c2");
166+
167+
//第二个TCC 事务参与者
168+
result = tccActionTwo.prepare(null, "two", list);
169+
if (!result) {
170+
throw new RuntimeException("TccActionTwo failed.");
171+
}
172+
map.put("xid", RootContext.getXID());
173+
174+
//这里故意抛出异常,TC会触发这两个TCC参与者的rollback方法进行回滚
175+
throw new RuntimeException("transacton rollback");
176+
}
177+
178+
```
179+
91180
###### 执行流程:
92181
> - 步骤一,运行SeataServerStarter(程序会在本地启动Seata Server服务)
93182
> - 步骤二,运行SpringbootTccProviderApplication(程序会在本地使用Curator包自动启动Zookeeper服务,并启动Dubbo完成两个服务注册)

springboot-seata-tcc-sample/src/main/java/com/ipman/seata/tcc/springboot/dubbo/action/TccActionOne.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
public interface TccActionOne {
1616

1717
/**
18-
* 设置两阶段提交中
18+
* 第一个阶段:准备阶段
1919
*
2020
* @param actionContext
2121
* @param a
@@ -25,8 +25,20 @@ public interface TccActionOne {
2525
public boolean prepare(BusinessActionContext actionContext,
2626
@BusinessActionContextParameter(paramName = "a") int a);
2727

28+
/**
29+
* 第二个阶段:提交操作
30+
*
31+
* @param actionContext
32+
* @return
33+
*/
2834
public boolean commit(BusinessActionContext actionContext);
2935

36+
/**
37+
* 第三个阶段:回滚阶段
38+
*
39+
* @param actionContext
40+
* @return
41+
*/
3042
public boolean rollback(BusinessActionContext actionContext);
3143

3244
}

springboot-seata-tcc-sample/src/main/java/com/ipman/seata/tcc/springboot/dubbo/service/TccTransactionService.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class TccTransactionService {
2929
private TccActionTwo tccActionTwo;
3030

3131
/**
32-
* 发起分布式事务
32+
* 分布式事务提交demo
3333
*
3434
* @return
3535
*/
@@ -43,15 +43,19 @@ public String doTransactionCommit() {
4343
List<String> list = new ArrayList<>();
4444
list.add("c1");
4545
list.add("c2");
46+
47+
//第二个TCC 事务参与者
4648
result = tccActionTwo.prepare(null, "two", list);
4749
if (!result) {
4850
throw new RuntimeException("TccActionTwo failed.");
4951
}
52+
53+
//此时两个TCC参与者的prepare方法都执行成功了,TC就会触发这两个TCC参与者的commit方法进行提交
5054
return RootContext.getXID();
5155
}
5256

5357
/**
54-
* 回滚分布式事务
58+
* 分布式事务回滚demo
5559
*
5660
* @param map
5761
* @return
@@ -66,13 +70,15 @@ public String doTransactionRollback(Map<String, String> map) {
6670
List<String> list = new ArrayList<>();
6771
list.add("c1");
6872
list.add("c2");
73+
74+
//第二个TCC 事务参与者
6975
result = tccActionTwo.prepare(null, "two", list);
7076
if (!result) {
7177
throw new RuntimeException("TccActionTwo failed.");
7278
}
7379
map.put("xid", RootContext.getXID());
7480

75-
//这里故意抛出异常
81+
//这里故意抛出异常,TC会触发这两个TCC参与者的rollback方法进行回滚
7682
throw new RuntimeException("transacton rollback");
7783
}
7884

0 commit comments

Comments
 (0)