Есть ли другие случаи, когда "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":

enter image description here

При использовании 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 запрос выполняются, как показано ниже:

enter image description here

И, при использовании 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 запроса, как показано ниже:

enter image description here

При использовании 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 запроса, как показано ниже:

enter image description here

Итак, есть ли другие случаи, когда 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 запроса, как показано ниже.

enter image description here

При использовании 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 запрос выполняются, как показано ниже:

enter image description here

enter image description here

enter image description here

enter image description here

Вернуться на верх