XA Txn with Driver
# 模拟数据库驱动,提供 XA 的回调接口 class DatabaseDriver: def __init__(self, name): self.name = name def xa_prepare(self, transaction_id): print(f"{self.name}: Preparing transaction {transaction_id}") return "ready" def xa_commit(self, transaction_id): print(f"{self.name}: Committing transaction {transaction_id}") def xa_rollback(self, transaction_id): print(f"{self.name}: Rolling back transaction {transaction_id}") # 模拟协调者 class Coordinator: def __init__(self): self.participants = [] # 记录所有参与者 def add_participant(self, driver): self.participants.append(driver) def execute_transaction(self, transaction_id): # 第一阶段:准备阶段 prepare_status = [] for participant in self.participants: status = participant.xa_prepare(transaction_id) prepare_status.append(status) # 检查所有参与者是否准备就绪 if all(status == "ready" for status in prepare_status): # 第二阶段:提交 print(f"All participants ready. Committing transaction {transaction_id}.") for participant in self.participants: participant.xa_commit(transaction_id) else: # 回滚 print(f"Some participants not ready. Rolling back transaction {transaction_id}.") for participant in self.participants: participant.xa_rollback(transaction_id) # 模拟应用程序 class Application: def __init__(self, coordinator): self.coordinator = coordinator def run(self): transaction_id = "txn_123" print(f"Starting transaction {transaction_id}") self.coordinator.execute_transaction(transaction_id) ######################################################################################## # 模拟场景 driver1 = DatabaseDriver("Database1") driver2 = DatabaseDriver("Database2") coordinator = Coordinator() coordinator.add_participant(driver1) coordinator.add_participant(driver2) app = Application(coordinator) app.run() ######################################################################################## # Starting transaction txn_123 # Database1: Preparing transaction txn_123 # Database2: Preparing transaction txn_123 # All participants ready. Committing transaction txn_123. # Database1: Committing transaction txn_123 # Database2: Committing transaction txn_123
Leave a Comment