我需要确保从数据库中读取并写回的对象在此期间不能被另一个请求/进程修改.
transaction.atomic()保证吗?
到目前为止我的测试告诉我没有.如果他们没有任何问题,那么实现原子READS和WRITES的正确方法是什么?
我测试过的例子.
将Test类放在模型中的某个位置. atomic_test.py和atomic_test2.py应保存为管理命令.首先运行python manage.py atomic_test,然后运行python manage.py atomic_test2.第二个脚本不会阻止,其更改将丢失.
models.py
class Test(models.Model):
value = models.IntegerField()
atomic_test.py
from django.core.management.base import NoArgsCommand
from django.db import transaction
from time import sleep
from core.models import Test
class Command(NoArgsCommand):
option_list = NoArgsCommand.option_list
def handle(self, **options):
Test.objects.all().delete()
t = Test(value=50)
t.save()
print '1 started'
with transaction.atomic():
t = Test.objects.all()[0]
sleep(10)
t.value = t.value + 10
t.save()
print '1 finished: %s' %Test.objects.all()[0].value
atomic_test2.py
from django.core.management.base import NoArgsCommand
from django.db import transaction
from time import sleep
from core.models import Test
class Command(NoArgsCommand):
option_list = NoArgsCommand.option_list
def handle(self, **options):
print '2 started'
with transaction.atomic():
t = Test.objects.all()[0]
t.value = t.value - 20
t.save()
print '2 finished: %s' %Test.objects.all()[0].value