Seata

发布时间 2023-07-19 09:49:00作者: lwx_R

1.安装部署

1.1 下载安装包解压

1.2 修改配置

  • file.conf修改数据库配置
user = "mysql"
password = "mysql
  • registry.conf 将type都换成nacos
type = "nacos"

1.3 启动seata-serve.bat

2.使用

  • application.yml
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
  • pom.xml
<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>
  • service
@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);
  • serviceImpl
@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