No contexto do processamento de transações de bancos de dados, suponha que uma transação Ta detém um bloqueio compartilhado no registro Ra e que uma transação Tb detém um bloqueio exclusivo no registro Rb. Nessas condições, considere as seguintes afirmativas. I. Uma solicitação de Ta por um bloqueio exclusivo em Rb coloca Ta em estado de espera. II. Uma solicitação de Tb por um bloqueio compartilhado em Ra será garantida. III. Uma solicitação de Tb por um bloqueio exclusivo em Ra coloca Tb em estado de espera. IV. Uma solicitação de Ta por um bloqueio compartilhado em Rb coloca Ta será garantida. Estão corretas as afirmativas
- A)I, II, III e IV.
Essa alternativa sustenta que as quatro afirmativas estão corretas. Em controle de concorrência por bloqueios, porém, a IV é falsa, porque um pedido de bloqueio compartilhado de Ta sobre Rb não pode ser concedido enquanto Tb mantém bloqueio exclusivo sobre o mesmo registro. A incompatibilidade entre compartilhado e exclusivo derruba a conclusão de que todas as proposições estariam certas.
- B)II e III, somente.
Aqui se afirma que apenas II e III estão corretas. A II procede, pois bloqueio compartilhado é compatível com outro compartilhado, de modo que Tb pode obter S em Ra; a III também procede, porque um pedido de bloqueio exclusivo sobre um item já bloqueado compartilhada mente por outra transação gera espera. O erro é excluir a I, já que Ta pedindo X em Rb conflita com o X já detido por Tb e também entra em espera.
- C)II e IV, somente.
A alternativa diz que apenas II e IV estão corretas. A II realmente é verdadeira pelo critério de compatibilidade entre bloqueios compartilhados, mas a IV é falsa: Ta não tem garantia de obter S em Rb enquanto Tb mantém X no mesmo registro, porque S e X são incompatíveis. Além disso, essa opção ignora que I e III também são verdadeiras.
- D)I e III, somente.
Essa opção afirma que somente I e III estão corretas. De fato, I e III descrevem pedidos incompatíveis com o bloqueio já existente e, por isso, levam a espera: X sobre Rb conflita com X de Tb, e X sobre Ra conflita com S de Ta. O problema é que a II também é verdadeira, já que S pedido por Tb em Ra é compatível com S já existente em Ta.
- E)I, II e III, somente.
Esta é a alternativa correta porque reúne exatamente as afirmativas verdadeiras: I, II e III. O fundamento é a matriz de compatibilidade de bloqueios: X pedido por Ta em Rb conflita com X de Tb e gera espera; S pedido por Tb em Ra é compatível com S de Ta e deve ser concedido; X pedido por Tb em Ra conflita com S de Ta e também gera espera. A IV é a única falsa, porque S em Rb não pode ser garantido enquanto Tb detém X no mesmo registro.
Gabarito: E
Em controle de concorrência, tudo gira em torno da compatibilidade dos bloqueios. Bloqueio compartilhado (S) permite leitura concorrente, enquanto bloqueio exclusivo (X) é mais rígido: se alguém já tem X, ninguém mais entra nem para leitura naquele item. Em geral, S com S é compatível, mas X com qualquer outro bloqueio no mesmo registro não é. No enunciado, Ta já tem S em Ra e Tb já tem X em Rb. Então, quando Ta pede X em Rb, ela fica esperando, porque Rb já está travado exclusivamente por Tb. Isso confirma a afirmativa I. Quando Tb pede S em Ra, o pedido é atendido, porque Ra está com S em poder de Ta, e S com S é compatível. Logo, a afirmativa II está correta. Já quando Tb pede X em Ra, não há compatibilidade com o S de Ta, então Tb espera, o que torna a III correta. Por fim, Ta pedir S em Rb não seria garantido, porque Rb está sob X de Tb. Ou seja, a IV está errada. Esse raciocínio bate com a regra clássica de compatibilidade de locks usada em SGBDs e ensinada nos modelos de transações com duas fases de bloqueio.