F() 表达式和原子事务可以相互替换吗?

Bob*_*Bob 5 django transactions

替换此代码是否安全:

def view(request):
    reporter.stories_filed = F('stories_filed') + 1
Run Code Online (Sandbox Code Playgroud)

有了这个:

@transaction.atomic
def view(request):
    reporter.stories_filed += 1       
Run Code Online (Sandbox Code Playgroud)

这是错误的:

@transaction.atomic
def view(request):
    reporter.stories_filed = F('stories_filed') + 1
Run Code Online (Sandbox Code Playgroud)

?

Bob*_*Bob 2

答案取决于所使用的事务隔离级别(最常见的答案是NO

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

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

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

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

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