实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("account_freeze_tbl")
public class AccountFreeze implements Serializable {
@TableId
private String xid;
private String userId;
private Integer freezeMoney;
private Integer state;
public static abstract class State{
public final static int TRY=0;
public final static int CONFIRM=1;
public final static int CANCEL=2;
}
}
mapper
@Mapper
public interface AccountFreezeMapper extends BaseMapper<AccountFreeze> {
}
service
@Service
public class AccountTCCServiceImpl implements AccountTCCService {
@Autowired
private AccountMapper accountMapper;
@Autowired
private AccountFreezeMapper accountFreezeMapper;
@Override
@Transactional
public void deduction(String userId, int money) {
//获取事务的id
String xid= RootContext.getXID();
//扣减钱款
accountMapper.deduction(money,userId);
//冻结金额,事务状态
AccountFreeze af=new AccountFreeze();
af.setXid(xid);
af.setUserId(userId);
af.setFreezeMoney(money);
af.setState(AccountFreeze.State.TRY);
accountFreezeMapper.insert(af);
}
@Override
public boolean confirm(BusinessActionContext context) {
String xid=context.getXid();
int i = accountFreezeMapper.deleteById(xid);
return i==1;
}
@Override
public boolean cancel(BusinessActionContext context) {
//获取事务的id
String xid = context.getXid();
//根据事务id查询对象
AccountFreeze freeze = accountFreezeMapper.selectById(xid);
if (freeze==null){
AccountFreeze accountFreeze=new AccountFreeze();
accountFreeze.setState(AccountFreeze.State.CANCEL);
accountFreeze.setXid(xid);
accountFreeze.setFreezeMoney(0);
accountFreeze.setUserId((String) context.getActionContext("userId"));
accountFreezeMapper.insert(accountFreeze);
return true;
}
accountMapper.incrduction(freeze.getFreezeMoney(),freeze.getUserId());
//1. 恢复额度
freeze.setFreezeMoney(0);
freeze.setState(AccountFreeze.State.CANCEL); //恢复状态
int count = accountFreezeMapper.updateById(freeze);
return count==1;
}
}