我正在尝试更新 django 1.8.4 中的两个 IntegerField,所以我决定使用原子事务,但我有一些疑问:
1- 在这种情况下使用原子事务是个好主意吗?使用它的真正好处是什么?效率提高多少?
2- 我如何检查这两个部分是否工作相同?
A.
@transaction.atomic
class LinkManager(models.Manager):
def vote_up(self, pk, increment=True):
if increment:
<update field 1, incrementing by 1>
else:
<update field 1, decrementing by 1>
B.
class LinkManager(models.Manager):
def vote_up(self, pk, increment=True):
if increment:
with transaction.atomic():
<update field 1, incrementing by 1>
else:
with transaction.atomic():
<update field 1, decrementing by 1>
请您参考如下方法:
在这种情况下使用原子事务是个好主意吗?
不,atomic 装饰器确保在交易中要么执行全部更新,要么不执行任何更新。在这种情况下它可能完全没用。
atomic 有什么好处?
假设您正在更新表单中的一些模型,atomic 装饰器将确保所有模型都得到更新,或者如果出现错误。完全没有。
效率更高吗?
不,绝对不是。这是一个数据安全问题,它实际上比常规更新效率低且速度慢,因为它需要为每个 block 创建一个事务。
它是如何工作的?
在数据库中更新,而不是获取结果并将其写回,而只是让数据库为您增加它。
像这样:
from django.db.models import F
SomeModel.objects.filter(pk=123).update(some_field=F('some_field') + 1)
