Em uma aplicação bancária que utiliza um sistema de banco d...

Próximas questões
Com base no mesmo assunto
Q3508339 Banco de Dados

Em uma aplicação bancária que utiliza um sistema de banco de dados relacional compatível com o padrão ANSI SQL, um desenvolvedor implementa a seguinte lógica para garantir a consistência ao realizar transferências entre contas:



BEGIN;


SELECT saldo FROM contas WHERE id = 101 FOR UPDATE;


UPDATE contas SET saldo = saldo - 500 WHERE id = 101;


SELECT saldo FROM contas WHERE id = 202 FOR UPDATE;


UPDATE contas SET saldo = saldo + 500 WHERE id = 202;


COMMIT;



Durante testes de carga, outra transação concorrente tenta acessar a conta de id 101 logo após o início da transação acima. Com base nesse contexto, avalie as afirmações a seguir:


I. A cláusula FOR UPDATE utilizada no SELECT bloqueia a linha lida até o fim da transação, impedindo que outras transações atualizem ou façam SELECT FOR UPDATE na mesma linha enquanto o bloqueio estiver ativo.


II. O uso de FOR UPDATE é eficaz para evitar condições de corrida (race conditions) ao modificar linhas críticas em um modelo de leitura-modificação-escrita.


III. A cláusula FOR UPDATE garante isolamento no nível SERIALIZABLE por si só, impedindo leitura fantasma e garantindo que nenhuma transação concorrente acesse qualquer dado relacionado.



É correto o que se afirma em: 

Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: C – I e II, apenas.

Tema central da questão: O foco está em concorrência em banco de dados, especialmente no uso da cláusula FOR UPDATE para garantir o controle adequado ao modificar dados críticos em ambientes concorrentes. É um tema que aparece com frequência em provas para concursos públicos, pois diz respeito à integridade e isolamento das transações.

Resumo teórico: Em SGBDs relacionais compatíveis com ANSI SQL, a cláusula FOR UPDATE serve para bloquear as linhas retornadas por um SELECT durante a transação, prevenindo que outras transações façam alterações ou até mesmo outro SELECT FOR UPDATE nas mesmas linhas até que a transação original seja concluída. Isso é essencial para evitar problemas como condições de corrida (race conditions).

Fontes relevantes:
- ANSI SQL Standard
- Elmasri & Navathe – Sistemas de Banco de Dados
- Documentação Oracle/PostgreSQL: FOR UPDATE

Justificativa da alternativa correta (C):

I. Correta. O FOR UPDATE realmente bloqueia a linha selecionada até o COMMIT ou ROLLBACK, impedindo alterações concorrentes.
II. Correta. É uma técnica eficaz para evitar condições de corrida, pois ao bloquear a linha durante a leitura e atualização, impede-se que outra transação modifique simultaneamente o mesmo dado.

Análise das alternativas incorretas:

III. Incorreta. A cláusula FOR UPDATE não garante, isoladamente, o nível SERIALIZABLE nem impede leitura fantasma. Ela apenas bloqueia as linhas lidas, enquanto o nível SERIALIZABLE é um conjunto mais rigoroso de regras de isolamento, que pode envolver bloqueio de intervalos e previne até inserções fantasmas (novos registros que poderiam ser lidos em uma consulta repetida). Logo, FOR UPDATE atua sobre linhas já existentes, mas não sobre linhas que podem ser inseridas durante a transação.

Como interpretar o enunciado e evitar pegadinhas:

  • Desconfie de afirmações absolutas como “garante isolamento no nível SERIALIZABLE por si só”.
  • Fique atento à diferença entre bloquear linhas e garantir isolamento total.
  • Quando a alternativa associa FOR UPDATE a bloqueios totais ou ausência de qualquer acesso concorrente, desconfie: geralmente, o padrão limita-se às linhas selecionadas.

Gostou do comentário? Deixe sua avaliação aqui embaixo!

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo