F()表达式和原子事务是否可以互换?

时间:2015-07-27 14:24:15

标签: django transactions

替换此代码是否安全:

def view(request):
    reporter.stories_filed = F('stories_filed') + 1

用这个:

@transaction.atomic
def view(request):
    reporter.stories_filed += 1       

这是错的:

@transaction.atomic
def view(request):
    reporter.stories_filed = F('stories_filed') + 1

1 个答案:

答案 0 :(得分:1)

答案取决于所使用的交易隔离级别(通常答案是 NO

我在这里找到了非常详细的解释:

https://en.wikipedia.org/wiki/Isolation_(database_systems)

简要总结:有几个事务隔离级别会影响事务的运行方式,Django使用的级别取决于您的RDBMS,它的设置等。

只有“Serializable”事务隔离级别才能防止竞争条件(F对象的目的)。并且在大多数RDBMS和Django中默认不使用它。

事务的目的主要是另一件事:确保事务中的所有或者没有语句都被提交。