Django数据库--事务及事务回滚

Posted liuwei-book

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django数据库--事务及事务回滚相关的知识,希望对你有一定的参考价值。

二、保存点Savepoint(断点回滚)

保存点是事务中的标记,从原理实现上来说是一个类似存储结构的类。可以回滚部分事务,而不是完整事务,同时会保存部分事务。python后端程序可以使用保存点。

一旦打开事务atomic(),就会构建一系列等待提交或回滚的数据库操作。通常,如果发出回滚命令,则会回滚整个事务。保存点则提供了执行细粒度回滚的功能,而不是将执行的完全回滚transaction.rollback()。

 

工作原理:savepoint通过对返回sid后面的将要执行的数据库操作进行计数,并保存在内置的列表中,当对数据库数据库进行操作时遇到错误而中断,根据sid寻找之前的保存点并回滚数据,并将这个操作从列表中删除。

 

相关API:

1. savepoint(using = None)

创建一个新的保存点。这表示处于正常状态的事务的一个点。返回保存点ID(sid)。在一个事务中可以创建多个保存点。

2. savepoint_commit(sid,using = None)

发布保存点sid,从创建保存点开始执行的数据库操作将成为可能回滚事务的一部分

3. savepoint_rollback(sid,using = None)

将事务回滚到保存点sid

4. clean_savepoints(using = None)

重置用于生成唯一保存点ID的计数器

值得注意的是:

这些函数中的每一个都接受一个using参数,该参数是数据库的名称。如果using未提供参数,则使用"default"默认数据库。

from django.db import transaction


# open a transaction
@transaction.atomic
def add_author_views(request):
    # 自动提交方式
    # Author.objects.create(name=u‘wangbaoqiang‘,age=33,email=‘wangbaoqiang@qqq.com‘)

    author_name = ulinghuchong
    author = Author(name=author_name,age=26,email=linghuchong@qqq.com)
    author.save()
    # transaction now contains author.save()

    sid = transaction.savepoint()

    try:
        count = Count(name=author_name, article_amount=1)
        count.save()
        # transaction now contains author.save() and count.save()
        transaction.savepoint_commit(sid)
        # open transaction still contains author.save() and count.save()
    except IntegrityError:
        transaction.savepoint_rollback(sid)
        # open transaction now contains only count.save()
        # 保存author操作回滚后,事务只剩下一个操作 

   transaction.clean_savepoints()  #清除保存点

注意:希望当遇到错误得到回滚的事务一定要放在try里面(如果放在try外面,虽然不会报错,但是是不会执行的)。如上面的例子,如果在给Count表执行插入数据发生错误,就会‘断点’回滚到Count表插入数据前,Author表插入的数据不变。

  

参考文章:https://www.cnblogs.com/thomson-fred/p/10198528.html

以上是关于Django数据库--事务及事务回滚的主要内容,如果未能解决你的问题,请参考以下文章

带有 MySQL 非事务性更改表的 Django 无法回滚

大数据必学Java基础(九十七):事务及回滚点

Django - 使用事务原子回滚保存

Django之事务

sql事务(Transaction)用法介绍及回滚实例

浅谈Mysql数据库事物及数据库引擎