Python中Django处理MySQL事务@transaction.atomic(using=‘default‘, savepoint=True)

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')

猜你喜欢

转载自blog.csdn.net/lxb_wyf/article/details/109739096