A ideia do uso da serialização (serializable isolation) para...
Uma transação T1 serializável gera um erro de conflito quando há uma tentativa de
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: D - escrita ou remoção sobre um registro que foi modificado e confirmado por uma transação T2, posterior a T1.
Para compreender a questão, é essencial entender o conceito de serialização nos sistemas de banco de dados. A serialização é um nível de isolamento de transações que visa garantir a consistência dos dados ao permitir que as transações sejam tratadas como se estivessem sendo executadas uma após a outra, ou seja, de forma serial, apesar de na realidade poderem estar ocorrendo concorrentemente.
No contexto da serialização, um erro de conflito ocorre quando uma transação tenta realizar operações que interferem na consistência dos dados em relação a outras transações. Isso pode incluir acessar ou modificar registros que estão sendo manipulados por outras transações.
A alternativa D é correta pois reflete uma situação em que uma transação T1 tenta escrever ou remover um registro que já foi modificado e confirmado (ou seja, o commit foi realizado) por outra transação T2 que ocorreu posteriormente à T1. Este é um exemplo clássico de conflito em um ambiente que utiliza serialização, pois vai contra a ideia de que as transações estão ocorrendo em uma sequência serializada, e essa operação comprometeria a consistência dos dados ao alterar um registro que deveria ter sido visto por T1 como imutável, baseando-se no estado em que estava quando T1 iniciou.
O erro de conflito destacado pela alternativa correta é uma consequência direta da violação do princípio de serializabilidade, que é um dos fundamentos para assegurar a integridade de dados em sistemas de bancos de dados que permitem concorrência de transações.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
O nível Serializable fornece o isolamento de transação mais rigoroso. Este nível emula a execução serial das transações, como se todas as transações fossem executadas uma após a outra, em série, em vez de simultaneamente. Entretanto, os aplicativos que utilizam este nível de isolamento devem estar preparados para tentar executar novamente as transações, devido a falhas de serialização.
Quando uma transação está no nível serializável, o comando SELECT enxerga apenas os dados efetivados antes da transação começar; nunca enxerga dados não efetivados ou alterações efetivadas durante a execução da transação por transações simultâneas (Entretanto, o comando SELECT enxerga os efeitos das atualizações anteriores executadas dentro da sua própria transação, mesmo que ainda não tenham sido efetivadas). É diferente do Read Committed, porque o comando SELECT enxerga um instantâneo do momento de início da transação, e não do momento de início do comando corrente dentro da transação. Portanto, comandos SELECT sucessivos dentro de uma mesma transação sempre enxergam os mesmos dados.
Os comandos UPDATE, DELETE e SELECT FOR UPDATE se comportam do mesmo modo que o comando SELECT para encontrar as linhas de destino: somente encontram linhas de destino efetivadas até o momento do início da transação. Entretanto, alguma linha de destino pode ter sido atualizada (ou excluída ou marcada para atualização) por outra transação simultânea no momento em que foi encontrada. Neste caso, a transação serializável aguarda a transação de atualização que começou primeiro efetivar ou desfazer as alterações (se ainda estiver executando). Se a transação que começou primeiro desfizer as alterações, então seus efeitos são negados e a transação serializável pode prosseguir com a atualização da linha original encontrada. Porém, se a transação que começou primeiro efetivar (e realmente atualizar ou excluir a linha, e não apenas selecionar para atualização), então a transação serializável é desfeita com a mensagem
ERRO: não foi possível serializar o acesso devido a atualização simultâneaporque uma transação serializável não pode alterar linhas alteradas por outra transação após a transação serializável ter começado.
Não entendi ainda =/
Na questão, poderá ocorrer o erro independente do tipo de operação (leitura/escrita) da transação T1 (que é a serializável).
O erro acontecerá se a transação concorrente (T2 e não a T1) efetivar seus comandos depois de T1 iniciar, porque se acontecer antes, os comandos já estão confirmados, não afetando as operações de T1.
Achei a redação das alternativas muito mal feita
escrita ou remoção sobre um registro que foi modificado e confirmado por uma transação T2, posterior a T1.
quer dizer q T1 leu o registro e depois ele foi alterado, fazendo a leitura do dado inconsistente
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo