Files
KaMixitong/app/utils/transaction.py
2026-03-25 15:24:22 +08:00

110 lines
2.5 KiB
Python

"""
数据库事务管理工具
提供统一的事务处理和异常处理机制
"""
from contextlib import contextmanager
from flask import current_app
from app import db
import traceback
class TransactionError(Exception):
"""事务错误基类"""
pass
class TransactionRollbackError(TransactionError):
"""事务回滚错误"""
pass
@contextmanager
def transaction(auto_commit=True, auto_rollback=True):
"""
事务上下文管理器
Args:
auto_commit: 是否在成功时自动提交
auto_rollback: 是否在失败时自动回滚
Usage:
with transaction() as session:
# 执行数据库操作
pass
"""
try:
yield db.session
if auto_commit:
db.session.commit()
except Exception as e:
if auto_rollback:
db.session.rollback()
# 记录错误日志
error_msg = f"事务执行失败: {str(e)}"
current_app.logger.error(f"{error_msg}\n{traceback.format_exc()}")
# 抛出事务错误
raise TransactionRollbackError(error_msg) from e
def safe_commit():
"""
安全提交事务
Returns:
tuple: (success: bool, error: str or None)
"""
try:
db.session.commit()
return True, None
except Exception as e:
db.session.rollback()
error_msg = f"事务提交失败: {str(e)}"
current_app.logger.error(f"{error_msg}\n{traceback.format_exc()}")
return False, error_msg
def safe_rollback():
"""
安全回滚事务
Returns:
bool: 是否回滚成功
"""
try:
db.session.rollback()
return True
except Exception as e:
current_app.logger.error(f"事务回滚失败: {str(e)}\n{traceback.format_exc()}")
return False
def execute_in_transaction(func):
"""
装饰器:在事务中执行函数
Args:
func: 要执行的函数
Returns:
函数执行结果或TransactionError
Usage:
@execute_in_transaction
def create_license():
# 创建卡密逻辑
pass
"""
def wrapper(*args, **kwargs):
try:
result = func(*args, **kwargs)
db.session.commit()
return result
except Exception as e:
db.session.rollback()
error_msg = f"事务执行失败: {str(e)}"
current_app.logger.error(f"{error_msg}\n{traceback.format_exc()}")
raise TransactionError(error_msg) from e
return wrapper