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 = u‘linghuchong‘ 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数据库--事务及事务回滚的主要内容,如果未能解决你的问题,请参考以下文章