在某些时候,你可能会在视图修改两张数据表。并且想让他们同时成功或者同时失败。这就是事务的原子性(atomicity)。在django中应该怎么做呢?
详细可以参考官方文档:https://yiyibooks.cn/xx/Django_1.11.6/topics/db/transactions.html
这里简单地记录一下:
1.装饰器方式实现
@transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 ...
2.with语句方式实现
def viewfunc(request): # 这部分代码不在事务中,会被Django自动提交 ... with transaction.atomic(): # 这部分代码会在事务中执行 ...
但是这两种方式还不够完善,因为代码写在事务中,如果代码块执行过程中抛出异常,则django会自动回滚事务。如果代码块执行完毕没有抛出异常,则django会自动提交事务。但是!!!开发者不能调用代码来手动提交或回滚事务,这就很不方便。
这时候需要引入保存点这个东西。
使用保存点,可以实现回滚事务的一部分,而不是回滚整个事务操作。而且,可以手动提交事务或者回滚事务。
from django.db import transaction # 开启事务 @transaction.atomic def viewfunc(request): a.save() # 现在事务中包含了 a.save() 操作 save_id = transaction.savepoint() # 创建了一个保存点 b.save() # 现在事务中包含了 a.save()和b.save() 操作 transaction.savepoint_rollback(save_id) # b.save()的执行结果将被回滚 # 提交事务, a.save()生效, b.save()回滚 transaction.savepoint_commit(save_id)
原文地址:https://www.cnblogs.com/chichung/p/10054757.html
时间: 2024-10-09 21:55:13