替换此代码是否安全:
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
答案 0 :(得分:1)
答案取决于所使用的交易隔离级别(通常答案是 NO )
我在这里找到了非常详细的解释:
https://en.wikipedia.org/wiki/Isolation_(database_systems)
简要总结:有几个事务隔离级别会影响事务的运行方式,Django使用的级别取决于您的RDBMS,它的设置等。
只有“Serializable”事务隔离级别才能防止竞争条件(F对象的目的)。并且在大多数RDBMS和Django中默认不使用它。
事务的目的主要是另一件事:确保事务中的所有或者没有语句都被提交。