Como diz o brb tea, depende da implementação do banco de dados e do algoritmo que eles usam: MVCC ou Two Phase Locking.
CUBRID (RDBMS de código aberto) explica a ideia desses dois algoritmos:
- Bloqueio de duas fases (2PL)
A primeira é quando a transação T2 tenta alterar o registro A, ela sabe que a transação T1 já alterou o registro A e espera até que a transação T1 seja concluída porque a transação T2 não pode saber se a transação T1 será confirmada ou rolada costas. Este método é chamado de bloqueio de duas fases (2PL).
- Controle de simultaneidade de várias versões (MVCC)
A outra é permitir que cada uma delas, transações T1 e T2, tenham suas próprias versões alteradas. Mesmo quando a transação T1 mudou o registro A de 1 para 2, a transação T1 deixa o valor original 1 como está e escreve que a versão da transação T1 do registro A é 2. Então, a seguinte transação T2 altera o registro A de 1 a 3, não de 2 a 4, e escreve que a versão da transação T2 do registro A é 3.
Quando a transação T1 é revertida, não importa se o 2, a versão da transação T1, não é aplicado ao registro A. Depois disso, se a transação T2 for confirmada, o 3, a versão da transação T2, será aplicado ao registro A. Se a transação T1 for confirmada antes da transação T2, o registro A será alterado para 2 e, em seguida, para 3 no momento da confirmação da transação T2. O status final do banco de dados é idêntico ao status de execução de cada transação independentemente, sem qualquer impacto nas outras transações. Portanto, ele satisfaz a propriedade ACID. Esse método é chamado de controle de simultaneidade de várias versões (MVCC).
O MVCC permite modificações simultâneas ao custo de aumento da sobrecarga na memória (porque tem que manter versões diferentes dos mesmos dados) e computação (no nível REPETEABLE_READ você não pode perder atualizações, então deve verificar as versões dos dados, como Hiberate faz com o Optimistick Locking ).
Em 2PL Transaction, os níveis de isolamento controlam o seguinte :
Se bloqueios são executados quando os dados são lidos e que tipo de bloqueios são solicitados.
Por quanto tempo os bloqueios de leitura são mantidos.
Se uma operação de leitura faz referência a linhas modificadas por outra transação:
Bloqueie até que o bloqueio exclusivo na linha seja liberado.
Recupere a versão confirmada da linha que existia no momento em que a instrução ou transação foi iniciada.
Leia a modificação de dados não confirmada.
A escolha de um nível de isolamento de transação não afeta os bloqueios adquiridos para proteger as modificações de dados. Uma transação sempre obtém um bloqueio exclusivo em todos os dados que modifica e mantém esse bloqueio até que a transação seja concluída, independentemente do nível de isolamento definido para essa transação. Para operações de leitura, os níveis de isolamento da transação definem principalmente o nível de proteção contra os efeitos das modificações feitas por outras transações.
Um nível de isolamento mais baixo aumenta a capacidade de muitos usuários de acessar dados ao mesmo tempo, mas aumenta o número de efeitos de simultaneidade , como leituras sujas ou atualizações perdidas, que os usuários podem encontrar.
Exemplos concretos da relação entre bloqueios e níveis de isolamento no SQL Server (use 2PL, exceto em READ_COMMITED com READ_COMMITTED_SNAPSHOT = ON)
READ_UNCOMMITED: não emite bloqueios compartilhados para evitar que outras transações modifiquem os dados lidos pela transação atual. As transações READ UNCOMMITTED também não são bloqueadas por bloqueios exclusivos que impediriam a transação atual de ler linhas que foram modificadas, mas não confirmadas por outras transações. [...]
READ_COMMITED:
- Se READ_COMMITTED_SNAPSHOT estiver definido como OFF (o padrão): usa bloqueios compartilhados para evitar que outras transações modifiquem as linhas enquanto a transação atual está executando uma operação de leitura. Os bloqueios compartilhados também bloqueiam a instrução de ler linhas modificadas por outras transações até que a outra transação seja concluída. Os bloqueios de linha são liberados antes que a próxima linha seja processada. [...]
- Se READ_COMMITTED_SNAPSHOT estiver definido como ON, o Mecanismo de Banco de Dados usará o controle de versão de linha para apresentar a cada instrução um instantâneo consistente transacional dos dados conforme existiam no início da instrução. Os bloqueios não são usados para proteger os dados de atualizações por outras transações.
REPETEABLE_READ: bloqueios compartilhados são colocados em todos os dados lidos por cada instrução na transação e são mantidos até que a transação seja concluída.
SERIALIZABLE: Os bloqueios de intervalo são colocados no intervalo de valores-chave que correspondem às condições de pesquisa de cada instrução executada em uma transação. [...] Os bloqueios de intervalo são mantidos até que a transação seja concluída.