Skip to content

Commit 8f39cc4

Browse files
committed
增强用户事务控制
1 parent 811e3f0 commit 8f39cc4

12 files changed

Lines changed: 112 additions & 35 deletions

File tree

txlcn-common/src/main/java/com/codingapi/txlcn/common/util/id/DefaultIdGen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public synchronized String nextId() {
4949

5050
long seqWithMachine = (machineId << machineOffset & Long.MAX_VALUE) | seq;
5151

52-
return String.valueOf(curTime - START_TIME) + seqWithMachine;
52+
return Long.toHexString(curTime - START_TIME) + Long.toHexString(seqWithMachine);
5353
}
5454

5555
private long tilNextMillis() {

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/DTXLocalContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ public static void makeNeverAppeared() {
177177
*
178178
* @return 1 commit 0 rollback
179179
*/
180-
public static int transactionState() {
180+
public static int transactionState(int userDtxState) {
181181
DTXLocalContext dtxLocalContext = Objects.requireNonNull(currentLocal.get(), "DTX can't be null.");
182-
return dtxLocalContext.userTransactionState == -1 ? dtxLocalContext.sysTransactionState : dtxLocalContext.userTransactionState;
182+
return userDtxState == 1 ? dtxLocalContext.sysTransactionState : userDtxState;
183183
}
184184
}

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/context/DefaultGlobalContext.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,16 @@ public boolean isDTXTimeout() {
193193
return (System.currentTimeMillis() - txContext().getCreateTime()) >= clientConfig.getDtxTime();
194194
}
195195

196+
@Override
197+
public int dtxState(String groupId) {
198+
return this.attachmentCache.containsKey(groupId, "rollback-only") ? 0 : 1;
199+
}
200+
201+
@Override
202+
public void setRollbackOnly(String groupId) {
203+
this.attachmentCache.attach(groupId, "rollback-only", true);
204+
}
205+
196206
/**
197207
* 清理事务时调用
198208
*

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/context/TCGlobalContext.java

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@
3232
* @author ujued
3333
*/
3434
public interface TCGlobalContext {
35-
35+
3636
/**
3737
* set lcn connection
3838
*
3939
* @param groupId groupId
4040
* @param connectionProxy connectionProxy
4141
*/
4242
void setLcnConnection(String groupId, LcnConnectionProxy connectionProxy);
43-
43+
4444
/**
4545
* get lcn proxy
4646
*
@@ -49,7 +49,7 @@ public interface TCGlobalContext {
4949
* @throws TCGlobalContextException TCGlobalContextException
5050
*/
5151
LcnConnectionProxy getLcnConnection(String groupId) throws TCGlobalContextException;
52-
52+
5353
/**
5454
* get tcc info
5555
*
@@ -60,8 +60,8 @@ public interface TCGlobalContext {
6060
*/
6161
TccTransactionInfo tccTransactionInfo(String unitId, Supplier<TccTransactionInfo, TransactionException> supplier)
6262
throws TransactionException;
63-
64-
63+
64+
6565
/**
6666
* txc type lock
6767
*
@@ -70,7 +70,7 @@ TccTransactionInfo tccTransactionInfo(String unitId, Supplier<TccTransactionInfo
7070
* @param lockIdSet lockIdSet
7171
*/
7272
void addTxcLockId(String groupId, String unitId, Set<String> lockIdSet);
73-
73+
7474
/**
7575
* find txc lock set
7676
*
@@ -80,7 +80,7 @@ TccTransactionInfo tccTransactionInfo(String unitId, Supplier<TccTransactionInfo
8080
* @throws TCGlobalContextException TCGlobalContextException
8181
*/
8282
Set<String> findTxcLockSet(String groupId, String unitId) throws TCGlobalContextException;
83-
83+
8484
/**
8585
* table struct info
8686
*
@@ -90,59 +90,74 @@ TccTransactionInfo tccTransactionInfo(String unitId, Supplier<TccTransactionInfo
9090
* @throws SQLException SQLException
9191
*/
9292
TableStruct tableStruct(String table, Supplier<TableStruct, SQLException> structSupplier) throws SQLException;
93-
93+
9494
/**
9595
* clean group
9696
*
9797
* @param groupId groupId
9898
*/
9999
void clearGroup(String groupId);
100-
100+
101101
/**
102102
* start tx
103103
*
104104
* @return tx context info
105105
*/
106106
TxContext startTx();
107-
107+
108108
/**
109109
* get tx context info by groupId
110110
*
111111
* @param groupId groupId
112112
* @return tx context info
113113
*/
114114
TxContext txContext(String groupId);
115-
115+
116116
/**
117117
* get context info
118118
*
119119
* @return info
120120
*/
121121
TxContext txContext();
122-
122+
123123
/**
124124
* del tx info
125125
*/
126126
void destroyTx();
127-
127+
128128
/**
129129
* del tx info
130130
*
131131
* @param groupId groupId
132132
*/
133133
void destroyTx(String groupId);
134-
134+
135135
/**
136136
* has tx context
137137
*
138138
* @return bool
139139
*/
140140
boolean hasTxContext();
141-
141+
142142
/**
143143
* is time out
144144
*
145145
* @return bool
146146
*/
147147
boolean isDTXTimeout();
148+
149+
/**
150+
* 判断某个事务是否不允许提交
151+
*
152+
* @param groupId groupId
153+
* @return result
154+
*/
155+
int dtxState(String groupId);
156+
157+
/**
158+
* 设置某个事务组不允许提交
159+
*
160+
* @param groupId groupId
161+
*/
162+
void setRollbackOnly(String groupId);
148163
}

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/template/TransactionControlTemplate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void joinGroup(String groupId, String unitId, String transactionType, Tra
113113
try {
114114
txLogger.txTrace(groupId, unitId, "join group > {} > groupId: {xid}, unitId: {uid}", transactionType);
115115

116-
reliableMessenger.joinGroup(groupId, unitId, transactionType, DTXLocalContext.transactionState());
116+
reliableMessenger.joinGroup(groupId, unitId, transactionType, DTXLocalContext.transactionState(globalContext.dtxState(groupId)));
117117

118118
txLogger.txTrace(groupId, unitId, "{xid} join group message over.");
119119

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/transaction/lcn/control/LcnStartingTransaction.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.codingapi.txlcn.tc.core.DTXLocalContext;
2020
import com.codingapi.txlcn.tc.core.TxTransactionInfo;
2121
import com.codingapi.txlcn.tc.core.DTXLocalControl;
22+
import com.codingapi.txlcn.tc.core.context.TCGlobalContext;
2223
import com.codingapi.txlcn.tc.core.template.TransactionControlTemplate;
2324
import lombok.extern.slf4j.Slf4j;
2425
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,10 +34,13 @@ public class LcnStartingTransaction implements DTXLocalControl {
3334

3435
private final TransactionControlTemplate transactionControlTemplate;
3536

37+
private final TCGlobalContext globalContext;
38+
3639

3740
@Autowired
38-
public LcnStartingTransaction(TransactionControlTemplate transactionControlTemplate) {
41+
public LcnStartingTransaction(TransactionControlTemplate transactionControlTemplate, TCGlobalContext globalContext) {
3942
this.transactionControlTemplate = transactionControlTemplate;
43+
this.globalContext = globalContext;
4044
}
4145

4246
@Override
@@ -63,6 +67,7 @@ public void onBusinessCodeSuccess(TxTransactionInfo info, Object result) {
6367
public void postBusinessCode(TxTransactionInfo info) {
6468
// RPC close DTX group
6569
transactionControlTemplate.notifyGroup(
66-
info.getGroupId(), info.getUnitId(), info.getTransactionType(), DTXLocalContext.transactionState());
70+
info.getGroupId(), info.getUnitId(), info.getTransactionType(),
71+
DTXLocalContext.transactionState(globalContext.dtxState(info.getGroupId())));
6772
}
6873
}

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/transaction/tcc/control/TccStartingTransaction.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ public class TccStartingTransaction implements DTXLocalControl {
3939

4040
private final TransactionControlTemplate transactionControlTemplate;
4141

42-
private final TCGlobalContext context;
42+
private final TCGlobalContext globalContext;
4343

4444
@Autowired
4545
public TccStartingTransaction(TransactionControlTemplate transactionControlTemplate,
46-
TCGlobalContext context) {
46+
TCGlobalContext globalContext) {
4747
this.transactionControlTemplate = transactionControlTemplate;
48-
this.context = context;
48+
this.globalContext = globalContext;
4949
}
5050

5151
static TccTransactionInfo prepareTccInfo(TxTransactionInfo info) throws TransactionException {
@@ -81,7 +81,7 @@ static TccTransactionInfo prepareTccInfo(TxTransactionInfo info) throws Transact
8181
public void preBusinessCode(TxTransactionInfo info) throws TransactionException {
8282
// cache tcc info
8383
try {
84-
context.tccTransactionInfo(info.getUnitId(), () -> prepareTccInfo(info))
84+
globalContext.tccTransactionInfo(info.getUnitId(), () -> prepareTccInfo(info))
8585
.setMethodParameter(info.getTransactionInfo().getArgumentValues());
8686
} catch (Throwable throwable) {
8787
throw new TransactionException(throwable);
@@ -110,6 +110,7 @@ public void onBusinessCodeSuccess(TxTransactionInfo info, Object result) {
110110
@Override
111111
public void postBusinessCode(TxTransactionInfo info) {
112112
transactionControlTemplate.notifyGroup(
113-
info.getGroupId(), info.getUnitId(), info.getTransactionType(), DTXLocalContext.transactionState());
113+
info.getGroupId(), info.getUnitId(), info.getTransactionType(),
114+
DTXLocalContext.transactionState(globalContext.dtxState(info.getGroupId())));
114115
}
115116
}

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/core/transaction/txc/control/TxcStartingTransaction.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.codingapi.txlcn.tc.core.DTXLocalContext;
2020
import com.codingapi.txlcn.tc.core.DTXLocalControl;
2121
import com.codingapi.txlcn.tc.core.TxTransactionInfo;
22+
import com.codingapi.txlcn.tc.core.context.TCGlobalContext;
2223
import com.codingapi.txlcn.tc.core.template.TransactionControlTemplate;
2324
import lombok.extern.slf4j.Slf4j;
2425
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,9 +37,12 @@ public class TxcStartingTransaction implements DTXLocalControl {
3637

3738
private final TransactionControlTemplate transactionControlTemplate;
3839

40+
private final TCGlobalContext globalContext;
41+
3942
@Autowired
40-
public TxcStartingTransaction(TransactionControlTemplate transactionControlTemplate) {
43+
public TxcStartingTransaction(TransactionControlTemplate transactionControlTemplate, TCGlobalContext globalContext) {
4144
this.transactionControlTemplate = transactionControlTemplate;
45+
this.globalContext = globalContext;
4246
}
4347

4448
@Override
@@ -70,7 +74,7 @@ public void onBusinessCodeSuccess(TxTransactionInfo info, Object result) {
7074

7175
@Override
7276
public void postBusinessCode(TxTransactionInfo info) {
73-
int state = DTXLocalContext.transactionState();
77+
int state = DTXLocalContext.transactionState(globalContext.dtxState(info.getGroupId()));
7478

7579
// 关闭事务组
7680
transactionControlTemplate.notifyGroup(info.getGroupId(), info.getUnitId(), info.getTransactionType(), state);

txlcn-tc/src/main/java/com/codingapi/txlcn/tc/support/DTXAspectSupport.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,19 @@
1818
import com.codingapi.txlcn.tc.core.DTXLocalContext;
1919

2020
/**
21-
* Description:
21+
* Description: 将会在未来版本废弃。推荐使用 {@link DTXUserControls}
2222
* Date: 19-1-16 下午4:21
2323
*
2424
* @author ujued
25+
* @see DTXUserControls
2526
*/
26-
27-
public class DTXAspectSupport {
27+
@Deprecated
28+
public class DTXAspectSupport {
2829

2930
/**
3031
* 回滚分布式事务
3132
*/
3233
public static void setRollbackOnly() {
33-
DTXLocalContext.cur().setUserTransactionState(0);
34+
DTXUserControls.rollbackCurrentGroup();
3435
}
3536
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.codingapi.txlcn.tc.support;
2+
3+
import com.codingapi.txlcn.tc.core.context.TCGlobalContext;
4+
import com.codingapi.txlcn.tracing.TracingContext;
5+
import org.springframework.beans.BeansException;
6+
import org.springframework.context.ApplicationContext;
7+
import org.springframework.context.ApplicationContextAware;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.Objects;
11+
12+
/**
13+
* Description:
14+
* Date: 19-2-21 上午10:57
15+
*
16+
* @author ujued
17+
*/
18+
@Component
19+
public class DTXUserControls implements ApplicationContextAware {
20+
21+
private static ApplicationContext applicationContext;
22+
23+
private static TCGlobalContext globalContext;
24+
25+
public static void rollbackGroup(String groupId) {
26+
if (Objects.isNull(globalContext)) {
27+
globalContext = applicationContext.getBean(TCGlobalContext.class);
28+
}
29+
globalContext.setRollbackOnly(groupId);
30+
}
31+
32+
public static void rollbackCurrentGroup() {
33+
rollbackGroup(TracingContext.tracing().groupId());
34+
}
35+
36+
@Override
37+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
38+
DTXUserControls.applicationContext = applicationContext;
39+
}
40+
}

0 commit comments

Comments
 (0)