自学内容网 自学内容网

「一致性问题」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());
    }
}

原文地址:https://blog.csdn.net/u010720890/article/details/136475803

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!