48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""
|
|
Compensation Transaction Handler
|
|
Handles operations that cannot be rolled back (like file system operations).
|
|
"""
|
|
from typing import List, Callable
|
|
from app.core.logging_config import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class CompensationHandler:
|
|
"""补偿事务处理器,用于处理无法回滚的操作"""
|
|
|
|
def __init__(self):
|
|
self._compensations: List[Callable] = []
|
|
|
|
def register(self, compensation: Callable):
|
|
"""
|
|
注册补偿操作
|
|
|
|
Args:
|
|
compensation: 补偿操作的可调用对象
|
|
"""
|
|
self._compensations.append(compensation)
|
|
logger.debug(f"Registered compensation operation: {compensation.__name__ if hasattr(compensation, '__name__') else 'lambda'}")
|
|
|
|
def execute(self):
|
|
"""执行所有补偿操作(按注册的逆序执行)"""
|
|
if not self._compensations:
|
|
logger.debug("No compensation operations to execute")
|
|
return
|
|
|
|
logger.info(f"Executing {len(self._compensations)} compensation operations")
|
|
|
|
for compensation in reversed(self._compensations):
|
|
try:
|
|
compensation()
|
|
logger.debug(f"Compensation operation executed successfully")
|
|
except Exception as e:
|
|
logger.error(f"补偿操作失败: {e}", exc_info=True)
|
|
|
|
def clear(self):
|
|
"""清空补偿操作"""
|
|
count = len(self._compensations)
|
|
self._compensations.clear()
|
|
if count > 0:
|
|
logger.debug(f"Cleared {count} compensation operations")
|