由于之前系统中封装的DB事务处理是在SQL级,导致后续SQL执行失败无法回滚同一事务中已经执行的SQL,基于这样的不合理,故采用装饰器将DB事务手动处理进行提取封装。
以下为本次使用的代码:
- 定义手动事务处理装饰器
- 由于被装饰的方法参数多种多样,故采用动态参数*args、**kwargs
- 被装饰的方法需要使用装饰器中的数据库游标,故将cursor传入被装饰函数
# 手动事务处理装饰器
def manual_transaction(func):
def wrapper(*args,**kwargs):
conn = pymysql.connect(Config.dblink['url'], Config.dblink['username'], Config.dblink['password'],
Config.dblink['database'], charset='utf8')
cursor = conn.cursor()
try:
func(cursor,*args,**kwargs)
except Exception:
conn.rollback()
raise
finally:
conn.commit()
cursor.close()
conn.close()
return wrapper
- 使用装饰器
- 由于装饰器中传入了cursor,故被装饰方法需要增加一个cursor参数进行接收
@manual_transaction
def insertUISteps(cursor,id,steps):
rs = cursor.execute("SELECt 1 FROM ui_steps WHERe case_id=%s", [id])
if rs > 0:
cursor.execute("DELETe FROM ui_steps WHERe case_id=%s", [id])
if len(steps) == 0: return
items = []
......
insertSQL = f"INSERT INTO ui_steps VALUES{','.join(items)};"
cursor.execute(insertSQL)



