Python中Django处理MySQL事务@transaction.atomic(using=‘default’, savepoint=True)
from django.db import transaction # 导入事务模块
在Django中开启MySQL事务有两种方式, 一种是使用装饰器,还有一种是使用with (相当于上下文管理器)来开启事务
装饰器方式
在函数视图中
# 在函数视图添加一个@transaction.atomic装饰器
# 接受一个 using 参数表示所要操作的数据库。如果未提供,则 Django 使用 "default" 数据库。
# 装饰器保证该函数中所有的数据库操作都在一个事务中
@transaction.atomic(using='default', savepoint=True)
def viewfunc(request):
# 设置一个事务保存点
sl1 = transaction.savepoint() # 可以设置多个保存点
数据库操作01
数据库操作02
...
# 事务回滚, 如果发生异常,可以回滚到制定的保存点
transaction.savepoint_rollback(sl1)
# 提交事务,如果按照预定的执行,没有异常就提交事务
# (这一步好像是自动提交的,应该没必要)
transaction.savepoint_commit(sl1)
return HttpResponse('ok')
类视图中
class MyView(View):
@transaction.atomic(using='default', savepoint=True)
def post(self, request):
# 设置一个事务保存点
sl1 = transaction.savepoint() # 可以设置多个保存点
数据库操作01
数据库操作02
...
# 事务回滚, 如果发生异常,可以回滚到制定的保存点
transaction.savepoint_rollback(sl1)
# 提交事务,如果按照预定的执行,没有异常就提交事务
# (这一步好像是自动提交的,应该没必要)
transaction.savepoint_commit(sl1)
return HttpResponse('ok')
with(上下文管理)方式
函数视图中
def funcview(request):
with transaction.atomic():
# 只要是在 with 语句下方的代码,涉及到数据库操作的流程,在操作数据哭库的时候会自动放到一个事务中
# 设置一个事务保存点
sl1 = transaction.savepoint() # 可以设置多个保存点
数据库操作01
数据库操作02
...
# 事务回滚, 如果发生异常,可以回滚到制定的保存点
transaction.savepoint_rollback(sl1)
# 提交事务,如果按照预定的执行,没有异常就提交事务
# (这一步好像是自动提交的,应该没必要)
transaction.savepoint_commit(sl1)
return HttpResponse('ok')
类视图中
class MyView(View):
def post(self, request):
with transaction.atomic():
# 只要是在 with 语句下方的代码,涉及到数据库操作的流程,在操作数据哭库的时候会自动放到一个事务中
# 设置一个事务保存点
sl1 = transaction.savepoint() # 可以设置多个保存点
数据库操作01
数据库操作02
...
# 事务回滚, 如果发生异常,可以回滚到制定的保存点
transaction.savepoint_rollback(sl1)
# 提交事务,如果按照预定的执行,没有异常就提交事务
# (这一步好像是自动提交的,应该没必要)
transaction.savepoint_commit(sl1)
return HttpResponse('ok')