Quando usar SELECT… FOR UPDATE?

Por favor me ajude a entender o caso de uso por trásSELECT ... FOR UPDATE.

Questão 1: É o seguinte um bom exemplo de quandoSELECT ... FOR UPDATE deve ser usado?

Dado:

quartos [id]tags [id, name]room_tags [room_id, tag_id]room_id e tag_id são chaves estrangeiras

O aplicativo deseja listar todas as salas e suas tags, mas precisa diferenciar entre as salas sem tags e as que foram removidas. Se SELECT ... FOR UPDATE não for usado, o que pode acontecer é:

Inicialmente:quartos contém[id = 1]tags contém[id = 1, name = 'cats']room_tags contém[room_id = 1, tag_id = 1]Tópico 1:SELECT id FROM rooms;returns [id = 1]Tópico 2:DELETE FROM room_tags WHERE room_id = 1;Tópico 2:DELETE FROM rooms WHERE id = 1;Tópico 2: [confirma a transação]Tópico 1:SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;retorna uma lista vazia

Agora o Thread 1 acha que a sala 1 não tem tags, mas na realidade a sala foi removida. Para resolver esse problema, o segmento 1 deveSELECT id FROM rooms FOR UPDATE, evitando assim que o Thread 2 seja excluídorooms até que o segmento 1 seja concluído. Isso está correto?

Questão 2: Quando se deve usarSERIALIZABLE isolamento de transação versusREAD_COMMITTED comSELECT ... FOR UPDATE?

Espera-se que as respostas sejam portáveis ​​(não específicas do banco de dados). Se isso não for possível, explique por quê.

questionAnswers(2)

yourAnswerToTheQuestion