Exemplos de gravações simultâneas
Os seguintes exemplos de pseudocódigo demonstram como as transações continuam ou aguardam ao serem executadas simultaneamente.
Operações COPY simultâneas na mesma tabela
A transação 1 copia linhas na tabela LISTING:
begin; copy listing from ...; end;
A transação 2 começa simultaneamente em uma sessão separada e tenta copiar mais linhas na tabela LISTING. A transação 2 deve aguardar até que a transação 1 libere o bloqueio de gravação na tabela LISTING para então proceder.
begin; [waits] copy listing from ; end;
O mesmo comportamento ocorreria se uma ou ambas as transações contivessem um comando INSERT em vez de um comando COPY.
Operações DELETE simultâneas da mesma tabela
A transação 1 exclui linhas de uma tabela:
begin; delete from listing where ...; end;
A transação 2 começa simultaneamente e tenta excluir linhas da mesma tabela. Ela terá êxito, pois ela espera até que a transação 1 seja concluída antes de tentar excluir linhas.
begin [waits] delete from listing where ; end;
O mesmo comportamento ocorreria se uma ou ambas as transações contivessem um comando UPDATE na mesma tabela em vez de um comando DELETE.
Transações simultâneas com uma combinação de operações de leitura e de gravação
Neste exemplo, a transação 1 exclui linhas da tabela USERS, recarrega a tabela, executa uma consulta COUNT(*) e ANALYZE antes de confirmar:
begin; delete one row from USERS table; copy ; select count(*) from users; analyze ; end;
Enquanto isso, a transação 2 começa. Essa transação tenta copiar linhas adicionais na tabela USERS, analisar a tabela e executar a mesma consulta COUNT (*) da primeira transação:
begin; [waits] copy users from ...; select count(*) from users; analyze; end;
A segunda transação terá êxito, pois ela deve aguardar a conclusão da primeira. Sua consulta COUNT retornará a contagem com base no carregamento que foi concluído.