文章目录

  • 分布式事务seata
    • 引入
    • 理论基础
      • CAP定理
      • BASE理论
    • 初识Seata
    • 动手实践
      • XA模式
      • AT模式
      • TCC模式
      • SAGA模式
    • 高可用

分布式事务seata

引入

微服务学习Day9-分布式事务Seata插图
微服务学习Day9-分布式事务Seata插图(1)
微服务学习Day9-分布式事务Seata插图(2)
微服务学习Day9-分布式事务Seata插图(3)
微服务学习Day9-分布式事务Seata插图(4)

理论基础

CAP定理

微服务学习Day9-分布式事务Seata插图(5)
微服务学习Day9-分布式事务Seata插图(6)
微服务学习Day9-分布式事务Seata插图(7)
微服务学习Day9-分布式事务Seata插图(8)
微服务学习Day9-分布式事务Seata插图(9)

BASE理论

微服务学习Day9-分布式事务Seata插图(10)
微服务学习Day9-分布式事务Seata插图(11)
微服务学习Day9-分布式事务Seata插图(12)

初识Seata

微服务学习Day9-分布式事务Seata插图(13)
微服务学习Day9-分布式事务Seata插图(14)
微服务学习Day9-分布式事务Seata插图(15)
微服务学习Day9-分布式事务Seata插图(16)
微服务学习Day9-分布式事务Seata插图(17)
微服务学习Day9-分布式事务Seata插图(18)
微服务学习Day9-分布式事务Seata插图(19)

动手实践

XA模式

微服务学习Day9-分布式事务Seata插图(20)
微服务学习Day9-分布式事务Seata插图(21)
微服务学习Day9-分布式事务Seata插图(22)
微服务学习Day9-分布式事务Seata插图(23)
微服务学习Day9-分布式事务Seata插图(24)

AT模式

微服务学习Day9-分布式事务Seata插图(25)
微服务学习Day9-分布式事务Seata插图(26)
微服务学习Day9-分布式事务Seata插图(27)
微服务学习Day9-分布式事务Seata插图(28)
微服务学习Day9-分布式事务Seata插图(29)
微服务学习Day9-分布式事务Seata插图(30)
微服务学习Day9-分布式事务Seata插图(31)
微服务学习Day9-分布式事务Seata插图(32)

TCC模式

微服务学习Day9-分布式事务Seata插图(33)
微服务学习Day9-分布式事务Seata插图(34)
微服务学习Day9-分布式事务Seata插图(35)
微服务学习Day9-分布式事务Seata插图(36)
微服务学习Day9-分布式事务Seata插图(37)
微服务学习Day9-分布式事务Seata插图(38)
微服务学习Day9-分布式事务Seata插图(39)
微服务学习Day9-分布式事务Seata插图(40)

@Service
@Slf4j
public class AccountTCCServiceImpl implements AccountTCCService {
@Autowired
private AccountMapper accountMapper;
@Autowired
private AccountFreezeMapper freezeMapper;
@Override
@Transactional
public void deduct(String userId, int money) {
// 0.获取事务id
String xid = RootContext.getXID();
//1.判断freeze中是否有冻结记录,如果有,一定是CANCEL执行过,我要拒绝业务
AccountFreeze oldFreeze = freezeMapper.selectById(xid);
if (oldFreeze != null){
//CANCEL执行过,我要拒绝业务
return;
}
// 1.扣减可用余额
accountMapper.deduct(userId, money);
// 2.记录冻结金额,事务状态
AccountFreeze freeze = new AccountFreeze();
freeze.setUserId(userId);
freeze.setFreezeMoney(money);
freeze.setState(AccountFreeze.State.TRY);
freeze.setXid(xid);
freezeMapper.insert(freeze);
}
@Override
public boolean confirm(BusinessActionContext ctx) {
// 1.获取事务id
String xid = ctx.getXid();
// 2.根据id删除冻结记录
int count = freezeMapper.deleteById(xid);
return count == 1;
}
@Override
public boolean cancel(BusinessActionContext ctx) {
// 0.查询冻结记录
String xid = ctx.getXid();
String userId = ctx.getActionContext("userId").toString();
AccountFreeze freeze = freezeMapper.selectById(xid);
//1.空回滚的判断,判断freeze是否为null,为null证明try没执行,需要空回滚
if (freeze == null){
freeze = new AccountFreeze();
freeze.setUserId(userId);
freeze.setFreezeMoney(0);
freeze.setState(AccountFreeze.State.CANCEL);
freeze.setXid(xid);
freezeMapper.insert(freeze);
return true;
}
//2.幂等判断
if (freeze.getState() == AccountFreeze.State.CANCEL) {
//已经处理过一次CANCEL,无需重复处理
return true;
}
// 1.恢复可用余额
accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());
// 2.将冻结金额清零,状态改为CANCEL
freeze.setFreezeMoney(0);
freeze.setState(AccountFreeze.State.CANCEL);
int count = freezeMapper.updateById(freeze);
return count == 1;
}
}

SAGA模式

微服务学习Day9-分布式事务Seata插图(41)
微服务学习Day9-分布式事务Seata插图(42)

高可用

微服务学习Day9-分布式事务Seata插图(43)

本站无任何商业行为
个人在线分享 » 微服务学习Day9-分布式事务Seata
E-->