Tengo un código que sería mucho más simple con llamadas anidadas a select_for_update() , pero me temo que me estoy preparando para un punto muerto.
Ejemplo:
with transaction.atomic(): uu1 = UniUser.objects.select_for_update().get(pk=uupk) with transaction.atomic(): uu2 = UniUser.objects.select_for_update().get(pk=uupk) # why no deadlock here?? uu2.bio = 'i like pizza' uu2.save() uu1.bio = 'i like pie' uu1.save() Habría esperado que el segundo select_for_update() se bloqueara, ya que está tratando de bloquear un registro ya bloqueado, pero este código funciona bien y terminamos con 'i like pie' en la biografía. Lo mismo sucede si elimino la transacción interna y solo bloqueo el mismo registro dos veces en la misma transacción.
¿Por qué no hay punto muerto aquí? ¿Es este un código seguro?
En caso de que la respuesta sea específica de la base de datos, estoy usando Postgres.
El candado es adquirido y retenido por su transacción.
Cuando intenta tomarlo nuevamente, no sucede nada ya que su transacción ya tiene un candado en esa fila.