Есть ли другие случаи, когда "select_for_update()" не работает в Django?
При использовании select_for_update() с update() как показано ниже. *Я использую Django 3.2.16:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here # Here
print(Person.objects.select_for_update().all().update(name="Tom"))
# Here # Here
print(Person.objects.select_for_update().filter(id=1).update(name="Tom"))
return HttpResponse("Test")
Только UPDATE
запрос выполняется без SELECT FOR UPDATE
запроса, как показано ниже. * Я использую PostgreSQL и эти журналы ниже являются запросами PostgreSQL и вы можете проверить В PostgreSQL, как регистрировать запросы с транзакционными запросами, такими как "BEGIN" и "COMMIT":
При использовании select_for_update()
с save(), как показано ниже:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here
person1 = Person.objects.select_for_update().all().first()
person1.name = "Tom"
person1.save() # Here
# Here
person2 = Person.objects.select_for_update().filter(id=1).first()
person2.name = "Tom"
person2.save() # Here
# Here
person3 = Person.objects.select_for_update().get(id=1)
person3.name = "Tom"
person3.save() # Here
return HttpResponse("Test")
SELECT FOR UPDATE
запрос и UPDATE
запрос выполняются, как показано ниже:
И, при использовании select_for_update()
с count() как показано ниже:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here # Here
print(Person.objects.select_for_update().all().count())
# Here # Here
print(Person.objects.select_for_update().filter(id=1).count())
return HttpResponse("Test")
SELECT
запрос выполняется вместо SELECT FOR UPDATE
запроса, как показано ниже:
При использовании select_for_update()
с len() как показано ниже:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here # Here
print(len(Person.objects.select_for_update().all()))
# Here # Here
print(len(Person.objects.select_for_update().filter(id=1)))
return HttpResponse("Test")
SELECT FOR UPDATE
запрос выполняется вместо SELECT
запроса, как показано ниже:
Итак, есть ли другие случаи, когда select_for_update()
не работает в Django в дополнение к тому, что я показал выше?
Да, есть и другие случаи, когда select_for_update()
не работает в Django.
При использовании select_for_update()
с delete() из a queryset как показано ниже:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here # Here
print(Person.objects.select_for_update().delete())
# Here # Here
print(Person.objects.select_for_update().all().delete())
# Here # Here
print(Person.objects.select_for_update().filter(id=1).delete())
return HttpResponse("Test")
Только DELETE
запрос выполняется без SELECT FOR UPDATE
запроса, как показано ниже.
При использовании select_for_update()
с delete()
объекта , как показано ниже:
# "store/views.py"
from django.db import transaction
from .models import Person
from django.http import HttpResponse
@transaction.atomic
def test(request):
# Here # Here
print(Person.objects.select_for_update().first().delete())
# Or
# Here # Here
print(Person.objects.select_for_update().all().first().delete())
# Or
# Here # Here
print(Person.objects.select_for_update().filter(id=1).first().delete())
# Or
# Here # Here
print(Person.objects.select_for_update().get(id=1).delete())
return HttpResponse("Test")
SELECT FOR UPDATE
запрос и DELETE
запрос выполняются, как показано ниже: