Django开启事务

开启事务

# 总结
#### 普通事务
# 1 普通事务操作(手动操作)
transaction.atomic()  # 开启事务
transaction.commit()  # 提交事务
transaction.rollback() # 回滚事务

# 2 可以使用上下文管理器来控制(自动操作)
with transaction.atomic():  # 自动提交和回滚


#### 保存点Savepoint
设置保存点:sid = transaction.savepoint()
提交保存点:transaction.savepoint_commit(sid)       transaction.commit()
回滚到保存点:transaction.savepoint_rollback(sid)   transaction.rollback()

#### 事务提交后回调函数
transaction.on_commit(send_email)

1 django中实现事务的几种方式

# 1 全局开启事务---> 全局开启事务,绑定的是http请求响应整个过程
    DATABASES = {
         'default': {
              #全局开启事务,绑定的是http请求响应整个过程
             'ATOMIC_REQUESTS': True, 
         }
    }
    from django.db import transaction
    # 局部禁用事务
    @transaction.non_atomic_requests
    def seckill(request):
        return HttpResponse('秒杀成功')
 
    
# 2 一个视图函数在一个事物中
    # fbv开启
    from django.db import transaction
    @transaction.atomic
    def seckill(request):
        return HttpResponse('秒杀成功')
    # cbv开启
    from django.db import transaction
    from rest_framework.views import APIView
    class SeckillAPIView(APIView):
        @transaction.atomic
        def post(self, request):
            pass

# 3 局部使用事务
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        pass  # 都在一个事物中
    return HttpResponse('秒杀成功')

2 事物的回滚和保存点

# 1 普通事务操作(手动操作)
transaction.atomic()  # 开启事务
transaction.commit()  # 提交事务
transaction.rollback() # 回滚事务

# 2 可以使用上下文管理器来控制(自动操作)
with transaction.atomic():  # 自动提交和回滚
    
    
# 3 保存点
	-开启事务
    干了点事
    设置保存点1
    干了点事
    设置一个保存点2
    干了点事
    
    回滚到干完第二个事,回滚到保存点2
    
    
'''
在事务操作中,我们还会经常显式地设置保存点(savepoint)
一旦发生异常或错误,我们使用savepoint_rollback方法让程序回滚到指定的保存点
如果没有问题,就使用savepoint_commit方法提交事务
'''
transaction.savepoint()  # 设置保存点
transaction.savepoint_rollback(sid)  # 保存点回滚
transaction.savepoint_commit(sid)  # 提交保存点

# 示例
from .models import Book
from django.db import transaction
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.name = '红楼梦'
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
            print('出异常了,回滚')
        # 如果没有异常,显式地提交一次事务
        transaction.savepoint_commit(sid)
    return HttpResponse('秒杀成功')
transaction.atomic()  # 开启事务
sid = transaction.savepoint() # 设置保存点
transaction.savepoint_rollback(sid) # 回滚到保存点
transaction.savepoint_commit(sid) #提交保存点

 

3 事务提交后,执行某个回调函数

# 有的时候我们希望当前事务提交后立即执行额外的任务,比如客户下订单后立即邮件通知卖家
transaction.on_commit(函数调用)

###### 案例一##################
def send_email():
    print('发送邮件给卖家了')
def seckill(request):
    with transaction.atomic():
        # 设置回滚点,一定要开启事务
        sid = transaction.savepoint()
        print(sid)
        try:
            book = Book.objects.get(pk=1)
            book.count = book.count-1
            book.save()
        except Exception as e:
            # 如发生异常,回滚到指定地方
            transaction.savepoint_rollback(sid)
        else:
            transaction.savepoint_commit(sid)
            #transaction.on_commit(send_email)
            transaction.on_commit(lambda: send_sms.delay('1898288322'))
    return HttpResponse('秒杀成功')


##### 案例二:celery中使用###
transaction.on_commit(lambda: send_sms.delay('1898288322'))
posted @ 2023-08-28 10:22  星空看海  阅读(23)  评论(0编辑  收藏  举报