¿Cuándo usar SELECT ... PARA ACTUALIZAR?

Por favor, ayúdame a entender el caso de uso detrásSELECT ... FOR UPDATE.

Pregunta 1: Es el siguiente un buen ejemplo de cuandoSELECT ... FOR UPDATE ¿debería ser usado?

Dado:

habitaciones [id]etiquetas [id, nombre]room_tags [room_id, tag_id]room_id y tag_id son claves foráneas

La aplicación desea enumerar todas las habitaciones y sus etiquetas, pero debe diferenciar entre habitaciones sin etiquetas en comparación con las habitaciones que se han eliminado. Si no se utiliza SELECT ... FOR UPDATE, lo que podría suceder es:

Inicialmente:habitaciones contiene[id = 1]etiquetas contiene[id = 1, name = 'cats']room_tags contiene[room_id = 1, tag_id = 1]Hilo 1:SELECT id FROM rooms;returns [id = 1]Hilo 2:DELETE FROM room_tags WHERE room_id = 1;Hilo 2:DELETE FROM rooms WHERE id = 1;Hilo 2: [comete la transacción]Hilo 1:SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;devuelve una lista vacía

Ahora el hilo 1 cree que la habitación 1 no tiene etiquetas, pero en realidad la sala se ha eliminado. Para resolver este problema, el hilo 1 debeSELECT id FROM rooms FOR UPDATE, evitando así que el hilo 2 se borre derooms hasta que el hilo 1 esté listo. ¿Es eso correcto?

Pregunta 2: Cuando se debe usarSERIALIZABLE aislamiento de transacción versusREAD_COMMITTED conSELECT ... FOR UPDATE?

Se espera que las respuestas sean portátiles (no específicas de la base de datos). Si eso no es posible, por favor explique por qué.

Respuestas a la pregunta(2)

Su respuesta a la pregunta