「一致性问题」TCC实现代码示例

在分布式事务中,TCC(Try-Confirm-Cancel)模式是一种常见的解决方案之一,用于确保多个操作的原子性。下面是一个简单的Java代码示例,演示了如何使用TCC模式实现张三向李四转账100元的操作:

import java.util.concurrent.atomic.AtomicInteger;

public class BankTransactionTCC {
    // 模拟银行账户类
    static class Account {
        private String name;
        private AtomicInteger balance;

        public Account(String name, int balance) {
            this.name = name;
            this.balance = new AtomicInteger(balance);
        }

        public String getName() {
            return name;
        }

        public int getBalance() {
            return balance.get();
        }

        // 尝试转账,预留资金
        public boolean tryTransfer(int amount) {
            int currentBalance = balance.get();
            if (currentBalance >= amount) {
                return balance.compareAndSet(currentBalance, currentBalance - amount);
            }
            return false;
        }

        // 确认转账,提交事务
        public void confirmTransfer(int amount) {
            balance.addAndGet(-amount);
            System.out.println(name + "向他人转账" + amount + "元,确认转账成功。");
        }

        // 取消转账,回滚事务
        public void cancelTransfer(int amount) {
            balance.addAndGet(amount);
            System.out.println(name + "向他人转账" + amount + "元,转账失败,资金已回滚。");
        }
    }

    // TCC事务管理器
    static class TCCManager {
        // 尝试转账
        public static boolean tryTransfer(Account from, Account to, int amount) {
            return from.tryTransfer(amount);
        }

        // 确认转账
        public static void confirmTransfer(Account from, Account to, int amount) {
            from.confirmTransfer(amount);
        }

        // 取消转账
        public static void cancelTransfer(Account from, Account to, int amount) {
            from.cancelTransfer(amount);
        }
    }

    public static void main(String[] args) {
        Account zhangSan = new Account("张三", 1000);
        Account liSi = new Account("李四", 500);

        // TCC模式实现转账
        boolean trySuccess = TCCManager.tryTransfer(zhangSan, liSi, 100);
        if (trySuccess) {
            TCCManager.confirmTransfer(zhangSan, liSi, 100);
        } else {
            TCCManager.cancelTransfer(zhangSan, liSi, 100);
        }

        // 打印转账后的余额
        System.out.println("张三的账户余额:" + zhangSan.getBalance());
        System.out.println("李四的账户余额:" + liSi.getBalance());
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值