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 estrangeirasO 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 vaziaAgora 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ê.