Por favor, ayúdenme a entender el caso de uso detrás de SELECT ... FOR UPDATE
.Cuándo usar SELECCIONAR ... PARA ACTUALIZAR?
Pregunta 1: ¿Es el siguiente un buen ejemplo de cuándo se debe usar SELECT ... FOR UPDATE
?
dado:
- habitaciones [id]
- etiquetas [id, nombre]
- room_tags [room_id, tag_id]
- room_id y tag_id son claves externas
La aplicación quiere enumerar todas las habitaciones y sus etiquetas, pero necesita diferenciar entre las habitaciones sin etiquetas y las habitaciones que se han eliminado. Si SELECT ... FOR no se utiliza 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]
- habitaciones contiene
- Hilo 1:
SELECT id FROM rooms;
returns [id = 1]
- Tema 2:
DELETE FROM room_tags WHERE room_id = 1;
- Tema 2:
DELETE FROM rooms WHERE id = 1;
- Tema 2: [confirma la transacción]
- Tema 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 subproceso 1 cree que la sala 1 no tiene etiquetas, pero en realidad la sala se ha eliminado. Para resolver este problema, el subproceso 1 debe SELECT id FROM rooms FOR UPDATE
, evitando así que el subproceso 2 elimine desde rooms
hasta que finalice el subproceso 1. ¿Es eso correcto?
Pregunta 2: ¿Cuándo se debe utilizar SERIALIZABLE
aislamiento de transacción en comparación con READ_COMMITTED
SELECT ... FOR UPDATE
?
Se espera que las respuestas sean portátiles (no específicas de la base de datos). Si eso no es posible, explica por qué.
¿Qué RDBMS estás usando? – Quassnoi
@Quassnoi, como se menciona en la parte inferior de la pregunta, estoy buscando una solución portátil (no específica de la base de datos). – Gili
¿Las opciones 'REPEATABLE_READ' y' READ_COMMITTED' son incluso opciones portátiles? Los únicos resultados que obtengo para aquellos son para el servidor MSSQL –