Comparar os níveis de isolamento do Babelfish e do SQL Server
Veja alguns exemplos das nuances na maneira como o SQL Server e o Babelfish implementam os níveis de isolamento ANSI.
nota
Os níveis de isolamento
REPEATABLE READeSNAPSHOTsão os mesmos no Babelfish.Os níveis de isolamento
READ UNCOMMITTEDeREAD COMMITTEDsão os mesmos no Babelfish.
O exemplo a seguir mostra como criar a tabela base para todos os exemplos mencionados abaixo:
CREATE TABLE employee ( id sys.INT NOT NULL PRIMARY KEY, name sys.VARCHAR(255)NOT NULL, age sys.INT NOT NULL ); INSERT INTO employee (id, name, age) VALUES (1, 'A', 10); INSERT INTO employee (id, name, age) VALUES (2, 'B', 20); INSERT INTO employee (id, name, age) VALUES (3, 'C', 30);
Tópicos
Comparação entre os níveis de isolamento READ UNCOMMITTED do Babelfish e READ UNCOMMITTED do SQL Server
A tabela a seguir fornece detalhes sobre as leituras sujas quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento READ UNCOMMITTED no SQL Server em comparação com a implementação do Babelfish.
| Transação 1 | Transação 2 | READ UNCOMMITTED do SQL Server |
READ UNCOMMITTED do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Atualização bem-sucedida. |
Atualização bem-sucedida. |
|
Ocioso na transação |
|
Inserção bem-sucedida. |
Inserção bem-sucedida. |
|
|
Ocioso na transação |
A transação 1 pode ver as alterações não confirmadas da transação 2. |
O mesmo que |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Vê as alterações confirmadas pela transação 2. |
Vê as alterações confirmadas pela transação 2. |
Comparação entre os níveis de isolamento READ COMMITTED do Babelfish e READ COMMITTED do SQL Server
A tabela a seguir fornece detalhes sobre o comportamento do bloqueio das leituras e das gravações quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento READ COMMITTED no SQL Server em comparação com a implementação do Babelfish.
| Transação 1 | Transação 2 | READ COMMITTED do SQL Server |
READ COMMITTED do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Atualização bem-sucedida. |
Atualização bem-sucedida. |
|
|
Ocioso na transação |
Etapa bloqueada até que a transação 2 seja confirmada. |
As alterações da transação 2 ainda não estão visíveis. Updates row with id=3. |
|
Ocioso na transação |
|
A transação 2 foi confirmada com êxito. A transação 1 agora está desbloqueada e vê a atualização da transação 2. |
A transação 2 foi confirmada com êxito. |
|
|
Ocioso na transação |
A transação 1 atualiza a linha com id = 1. |
A transação 1 atualiza a linha com id = 3. |
Comparação entre os níveis de isolamento READ COMMITTED do Babelfish e READ COMMITTED SNAPSHOT do SQL Server
A tabela a seguir fornece detalhes sobre o comportamento do bloqueio das linhas recém-inseridas quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento READ COMMITTED SNAPSHOT no SQL Server em comparação com a implementação do READ COMMITTED no Babelfish.
| Transação 1 | Transação 2 | READ COMMITTED SNAPSHOT do SQL Server |
READ COMMITTED do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Etapa bloqueada até que a Transação 1 seja confirmada. A linha inserida está bloqueada pela transação 1. |
Três linhas atualizadas. A linha recém-inserida ainda não está visível. |
|
|
Ocioso na transação |
Confirmação bem-sucedida. A transação 2 agora está desbloqueada. |
Confirmação bem-sucedida. |
|
Ocioso na transação |
|
Todas as quatro linhas têm idade = 99. |
A linha com id = 4 tem o valor de idade 40, pois não estava visível para a transação 2 durante a consulta de atualização. Outras linhas são atualizadas para idade = 99. |
Comparação entre os níveis de isolamento REPEATABLE READ do Babelfish e REPEATABLE READ do SQL Server
A tabela a seguir fornece detalhes sobre o comportamento do bloqueio das leituras e das gravações quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento REPEATABLE READ no SQL Server em comparação com a implementação do REPEATABLE READ no Babelfish.
| Transação 1 | Transação 2 | REPEATABLE READ do SQL Server |
REPEATABLE READ do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A transação 2 permanece bloqueada até que a transação 1 seja confirmada. |
A transação 2 prossegue normalmente. |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A atualização da transação 1 está visível. |
A atualização da transação 1 não está visível. |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Vê a atualização da transação 1. |
Vê a atualização da transação 1. |
A tabela a seguir fornece detalhes sobre o comportamento do bloqueio de gravação-gravação quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento REPEATABLE READ no SQL Server em comparação com a implementação do REPEATABLE READ no Babelfish.
| Transação 1 | Transação 2 | REPEATABLE READ do SQL Server |
REPEATABLE READ do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Transação 2 bloqueada. |
Transação 2 bloqueada. |
|
|
Ocioso na transação |
A confirmação foi bem-sucedida e a transação 2 foi desbloqueada. |
A confirmação foi bem-sucedida e a transação 2 falha com erro, não foi possível serializar o acesso devido à atualização simultânea. |
|
Ocioso na transação |
|
Confirmação bem-sucedida. |
A transação 2 já foi cancelada. |
|
Ocioso na transação |
|
Row with id=1 has name='A_TX2'. |
Row with id=1 has name='A_TX1'. |
A tabela a seguir fornece detalhes sobre as leituras fantasmas quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento REPEATABLE READ no SQL Server em comparação com a implementação do REPEATABLE READ no Babelfish.
| Transação 1 | Transação 2 | REPEATABLE READ do SQL Server |
REPEATABLE READ do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A transação 2 prossegue sem nenhum bloqueio. |
A transação 2 prossegue sem nenhum bloqueio. |
|
Ocioso na transação |
|
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A nova linha inserida pela transação 2 está visível. |
A nova linha inserida pela transação 2 não está visível. |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
A tabela a seguir fornece detalhes de quando as transações simultâneas são executadas e os diferentes resultados finais ao usar o nível de isolamento REPEATABLE READ no SQL Server em comparação com a implementação do REPEATABLE READ do Babelfish.
| Transação 1 | Transação 2 | REPEATABLE READ do SQL Server |
REPEATABLE READ do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 atualiza a linha com id 1. |
A transação 1 atualiza a linha com id 1. |
|
Ocioso na transação |
|
A transação 2 está bloqueada porque a declaração SELECT tenta ler as linhas bloqueadas pela consulta UPDATE na transação 1. |
A transação 2 prossegue sem nenhum bloqueio, pois a leitura nunca é bloqueada, a declaração SELECT é executada e, finalmente, a linha com id = 3 é atualizada, pois as alterações da transação 1 ainda não estão visíveis. |
|
Ocioso na transação |
|
Essa etapa é executada após a confirmação da transação 1. A linha com id = 1 é atualizada pela transação 2 na etapa anterior e está visível aqui. |
A linha com o id = 3 é atualizada pela Transação 2. |
|
|
Ocioso na transação |
A transação 2 agora está desbloqueada. |
Confirmação bem-sucedida. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
As duas transações executam a atualização na linha com id = 1. |
Linhas diferentes são atualizadas pelas transações 1 e 2. |
Comparação entre os níveis de isolamento SERIALIZABLE do Babelfish e SERIALIZABLE do SQL Server
A tabela a seguir fornece detalhes sobre os bloqueios de alcance quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento SERIALIZABLE no SQL Server em comparação com a implementação do SERIALIZABLE no Babelfish.
| Transação 1 | Transação 2 | SERIALIZABLE do SQL Server |
SERIALIZABLE do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A transação 2 permanece bloqueada até que a transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 foi confirmada com êxito. A transação 2 agora está desbloqueada. |
A transação 1 foi confirmada com êxito. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
A tabela a seguir fornece detalhes de quando as transações simultâneas são executadas e os diferentes resultados finais ao usar o nível de isolamento SERIALIZABLE no SQL Server em comparação com a implementação do SERIALIZABLE do Babelfish.
| Transação 1 | Transação 2 | SERIALIZABLE do SQL Server |
SERIALIZABLE do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 permanece bloqueada até que a transação 2 seja confirmada. |
A transação 1 prossegue sem nenhum bloqueio. |
|
Ocioso na transação |
|
A transação 2 foi confirmada com êxito. A transação 1 agora está desbloqueada. |
A transação 2 foi confirmada com êxito. |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A linha recém-inserida é visível com valor de idade = 99. |
A linha recém-inserida é visível com valor de idade = 40. |
A tabela a seguir fornece detalhes quando você aplica INSERT em uma tabela com restrição exclusiva. Ela mostra os resultados observados ao usar o nível de isolamento SERIALIZABLE no SQL Server em comparação com a implementação do SERIALIZABLE no Babelfish.
| Transação 1 | Transação 2 | SERIALIZABLE do SQL Server |
SERIALIZABLE do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 permanece bloqueada até que a transação 2 seja confirmada. |
A transação 1 permanece bloqueada até que a transação 2 seja confirmada. |
|
Ocioso na transação |
|
A transação 2 foi confirmada com êxito. A transação 1 agora está desbloqueada. |
A transação 2 foi confirmada com êxito. A transação 1 cancelada com erro de valor de chave duplicado viola a restrição exclusiva. |
|
|
Ocioso na transação |
A transação 1 foi confirmada com êxito. |
As confirmações da transação 1 falham, pois não foi possível serializar o acesso devido às dependências de leitura ou de gravação entre as transações. |
|
|
Ocioso na transação |
row (5, 'E', 50) is inserted. |
Existem apenas quatro linhas. |
No Babelfish, transações simultâneas executadas com o nível de isolamento serializável falharão com erro de anomalia de serialização se a execução dessas transações for inconsistente com todas as possíveis execuções seriais (uma por vez) dessas transações.
As tabelas a seguir fornecem detalhes sobre a anomalia de serialização quando transações simultâneas são realizadas. Ela mostra os resultados observados ao usar o nível de isolamento SERIALIZABLE no SQL Server em comparação com a implementação do SERIALIZABLE no Babelfish.
| Transação 1 | Transação 2 | SERIALIZABLE do SQL Server |
SERIALIZABLE do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A transação 2 permanece bloqueada até que a transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 foi confirmada com êxito. |
A transação 1 é confirmada primeiro e pode ser confirmada com êxito. |
|
Ocioso na transação |
|
A transação 2 foi confirmada com êxito. |
A confirmação da transação 2 falha com erro de serialização, toda a transação foi revertida. Repita a transação 2. |
|
|
Ocioso na transação |
As alterações das duas transações estão visíveis. |
A transação 2 foi revertida. Somente as alterações da transação 1 são observadas. |
No Babelfish, a anomalia de serialização só será possível se todas as transações simultâneas estiverem sendo executadas no nível de isolamento SERIALIZABLE. Na tabela a seguir, vamos pensar no exemplo acima, mas definir a transação 2 como nível de isolamento REPEATABLE READ.
| Transação 1 | Transação 2 | Níveis de isolamento do SQL Server | Níveis de isolamento do Babelfish |
|---|---|---|---|
|
|
|
Nenhum |
Nenhum |
|
|
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
|
Ocioso na transação |
Nenhum |
Nenhum |
|
Ocioso na transação |
|
A transação 2 permanece bloqueada até que a transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
Ocioso na transação |
|
Nenhum |
Nenhum |
|
|
Ocioso na transação |
A transação 1 foi confirmada com êxito. |
A transação 1 foi confirmada com êxito. |
|
Ocioso na transação |
|
A transação 2 foi confirmada com êxito. |
A transação 2 foi confirmada com êxito. |
|
|
Ocioso na transação |
As alterações das duas transações estão visíveis. |
As alterações das duas transações estão visíveis. |