1.安装部署
1.1 下载安装包解压
1.2 修改配置
user = "mysql"
password = "mysql
- registry.conf 将type都换成nacos
type = "nacos"
1.3 启动seata-serve.bat
2.使用
seata:
tx-service-group: seckill-service-group
registry:
type: nacos
nacos:
server-addr: 127.0.0.1
group: SEATA_GROUP
application: seata-server
service:
vgroup-mapping:
seckill-service-group: default
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
@TwoPhaseBusinessAction(name = "decrIntegralTry",commitMethod = "decrIntegralCommit",rollbackMethod = "decrIntegralRollback")
void decrIntegralTry(@BusinessActionContextParameter(paramName = "vo") OperateIntergralVo vo, BusinessActionContext context);
//TCC中的Confirm
void decrIntegralCommit(BusinessActionContext context);
//TCC中的Cancel
void decrIntegralRollback(BusinessActionContext context);
@Override
@Transactional
public void decrIntegralTry(OperateIntergralVo vo, BusinessActionContext context) {
System.out.println("执行TRY方法");
//插入事务控制表
AccountTransaction log = new AccountTransaction();
log.setTxId(context.getXid());//全局事务ID
log.setActionId(context.getBranchId());//分支事务ID
Date now = new Date();
log.setGmtCreated(now);
log.setGmtModified(now);
log.setUserId(vo.getUserId());
log.setAmount(vo.getValue());
accountTransactionMapper.insert(log);
//执行业务逻辑--->减积分
int effectCount = usableIntegralMapper.decrIntergral(vo.getUserId(), vo.getValue());
if(effectCount==0){
throw new BusinessException(IntergralCodeMsg.INTERGRAL_NOT_ENOUGH);
}
}
@Override
public void decrIntegralCommit(BusinessActionContext context) {
System.out.println("执行COMMIT方法");
JSONObject jsonObject = (JSONObject) context.getActionContext("vo");
OperateIntergralVo vo = jsonObject.toJavaObject(OperateIntergralVo.class);
System.out.println("vo对-象:"+vo);
//查询事务记录
AccountTransaction accountTransaction = accountTransactionMapper.get(context.getXid(), context.getBranchId());
if(accountTransaction!=null){
//如果不为空
if(AccountTransaction.STATE_TRY==accountTransaction.getState()){
//如果状态为TRY,执行COMMIT逻辑
//更新日志的状态 空操作
accountTransactionMapper.updateAccountTransactionState(context.getXid(), context.getBranchId(), AccountTransaction.STATE_COMMIT, AccountTransaction.STATE_TRY);
}else if(AccountTransaction.STATE_COMMIT==accountTransaction.getState()){
//如果状态为COMMIT,不做事情
}else{
//如果状态是其他--->写MQ通知管理员
}
}else{
//如果为空--->写MQ通知管理员
}
}
@Override
@Transactional
public void decrIntegralRollback(BusinessActionContext context) {
System.out.println("执行ROLLBACK方法");
AccountTransaction accountTransaction = accountTransactionMapper.get(context.getXid(), context.getBranchId());
if(accountTransaction!=null){
//存在日志记录
if(AccountTransaction.STATE_TRY == accountTransaction.getState()){
//处于TRY状态
//将状态修改成Cancel状态
accountTransactionMapper.updateAccountTransactionState(context.getXid(),context.getBranchId(),AccountTransaction.STATE_CANCEL,AccountTransaction.STATE_TRY);
//执行Cancel业务逻辑,添加积分.
usableIntegralMapper.incrIntergral(accountTransaction.getUserId(),accountTransaction.getAmount());
}else if (AccountTransaction.STATE_CANCEL == accountTransaction.getState()){
//之前已经执行过Cancel,幂等处理
}else{
//其他情况,通知管理员
}
}else{
/* String str = (String) context.getActionContext("vo");
System.out.println("存储上下文的对象:"+str);
OperateIntergralVo vo = JSON.parseObject(str,OperateIntergralVo.class);*/
JSONObject jsonObject = (JSONObject) context.getActionContext("vo");
OperateIntergralVo vo = jsonObject.toJavaObject(OperateIntergralVo.class);
//不存在日志记录
//插入事务控制表
AccountTransaction log = new AccountTransaction();
log.setTxId(context.getXid());//全局事务ID
log.setActionId(context.getBranchId());//分支事务ID
Date now = new Date();
log.setGmtCreated(now);
log.setGmtModified(now);
log.setUserId(vo.getUserId());
log.setAmount(vo.getValue());
log.setState(AccountTransaction.STATE_CANCEL);
accountTransactionMapper.insert(log);
}
}
- 全局事务
@GlobalTransactional