【事务】Django中的事务处理【原创】

参考

官方文档


事务

默认情况下,Django事务是自动提交的,一旦数据变动会立即自动提交,不会有隐式回滚


如果要使用事务,有两种方法:

  • with用法(推荐)
  • 装饰器用法

1. with用法

可以灵活的有选择性的把某些 MySQL 数据库的操作看做一个事务。而且不用关心视图的类型。

比如:

from django.db import transaction
try:
    with transaction.atomic():
        event = AlarmEvent.objects.get(id=id)
        event.msg_channel = msg_channel
        event.msg_receiver = msg_receiver
        event.msg_result = msg_result
        event.save()
    return 0, 'success'
except Exception as e:
    return 300, '更新数据库失败,失败原因:' + str(e)

这实现了事务,如果更新失败的话,会自动回滚


也可以自己来处理事务,自己控制回滚:

from django.db import transaction
with transation.atomic():
    # 设置事务回滚的标记点
    sid = transation.savepoint()
    try:
        t = Events.objects.filter(pk=1).exclude(title__in=["tt", "ttt"]).update(publish_id=3, guige_id=1)
        if t == 0:
            transaction.savepoint_rollback(sid)
        
        # 提交成功,显式的提交一次事务
        transaction.savepoint_commit(sid)    
    except:
        # 回滚
        transation.savepoint_rollback(sid)

2. 装饰器用法(不推荐)

这是使用装饰器对view视图开启事务
比如:

from django.db import transaction
@transaction.atomic
def index(request):
    //ORM操作
    return ....

整个视图中所有 MySQL 数据库的操作都看做一个事务,范围太大,不够灵活。而且无法直接作用于类视图


注意:在原子块中不要进行错误捕获
当退出原子块的时候,Django会去查看它是否正常退出或者是否有异常来确定是否提交或者回滚
如果你捕获并处理了原子块中的异常,可能会隐藏Django中发生问题的事实。这样可能会造成非预期的行为。

发布了64 篇原创文章 · 获赞 47 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/jiandanokok/article/details/101631147