【发布时间】:2015-01-25 14:51:38
【问题描述】:
我需要确保从数据库读取并写回的对象在此期间不能被另一个请求/进程修改。
transaction.atomic() 能保证吗?
到目前为止,我的测试告诉我没有。如果它们没有问题,那么实现原子读取和写入的正确方法是什么?
我测试过的例子。
将 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
【问题讨论】:
标签: python django concurrency transactions atomic