了解 Django 中的原子事务
Understanding atomic transactions in Django
我正在尝试更新 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
装饰器将确保所有模型都得到更新,或者如果出现错误。 None 完全没有。
效率更高吗?
不,绝对不是。这是一个数据安全问题,它实际上比常规更新效率低且速度慢,因为它需要为每个块创建一个事务。
它是如何工作的?
在数据库中更新,而不是获取结果并将其写回,而只是让数据库为您增加它。
像这样:
from django.db.models import F
SomeModel.objects.filter(pk=123).update(some_field=F('some_field') + 1)
我正在尝试更新 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
装饰器将确保所有模型都得到更新,或者如果出现错误。 None 完全没有。
效率更高吗?
不,绝对不是。这是一个数据安全问题,它实际上比常规更新效率低且速度慢,因为它需要为每个块创建一个事务。
它是如何工作的?
在数据库中更新,而不是获取结果并将其写回,而只是让数据库为您增加它。
像这样:
from django.db.models import F
SomeModel.objects.filter(pk=123).update(some_field=F('some_field') + 1)