由于之前系统中封装的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&#