Comparar os níveis de isolamento do Babelfish e do SQL Server
Veja alguns exemplos das nuances na forma como o SQL Server e o Babelfish implementam os níveis de isolamento ANSI.
nota
Os níveis de isolamento Repeatable Read e Snapshot são os mesmos no Babelfish.
O nível de isolamento Read Uncommitted e Read Committed sã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
- READ UNCOMMITTED DO BABELFISH VERSUS READ UNCOMMITTED ISOLATION LEVEL DO SQL SERVER
- READ COMMITTED DO BABELFISH VERSUS READ COMMITTED ISOLATION LEVEL DO SQL SERVER
- READ COMMITTED DO BABELFISH VERSUS READ COMMITTED SNAPSHOT ISOLATION LEVEL DO SQL SERVER
- REPEATABLE READ DO BABELFISH VERSUS REPEATABLE READ ISOLATION LEVEL DO SQL SERVER
- SERIALIZABLE DO BABELFISH VERSUS SERIALIZABLE ISOLATION LEVEL DO SQL SERVER
READ UNCOMMITTED DO BABELFISH VERSUS READ UNCOMMITTED ISOLATION LEVEL DO SQL SERVER
Transação 1 | Transação 2 | Read Uncommitted do SQL Server | Read Uncommitted do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; |
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; |
||
UPDATE employee SET age=0; |
Atualização bem-sucedida. |
Atualização bem-sucedida. |
|
INSERT INTO employee VALUES (4, 'D', 40); |
Inserção bem-sucedida. |
Inserção bem-sucedida. |
|
SELECT * FROM employee; |
A Transação 1 pode ver as alterações não confirmadas da Transação 2. |
O mesmo que Read Committed em Babelfish. Alterações não confirmadas da Transação 2 não são visíveis na Transação 1. |
|
COMMIT |
|||
SELECT * FROM employee; |
Vê as alterações confirmadas pela Transação 2. |
Vê as alterações confirmadas pela Transação 2. |
READ COMMITTED DO BABELFISH VERSUS READ COMMITTED ISOLATION LEVEL DO SQL SERVER
Transação 1 | Transação 2 | Read Committed do SQL Server | Read Committed do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
||
SELECT * FROM employee; |
|||
UPDATE employee SET age=100 WHERE id = 1; |
Atualização bem-sucedida. |
Atualização bem-sucedida. |
|
UPDATE employee SET age = 0 WHERE age IN (SELECT MAX(age) FROM employee); |
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. |
|
COMMIT |
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. |
|
SELECT * FROM employee; |
A transação 1 atualiza a linha com id = 1. |
A transação 1 atualiza a linha com id = 3. |
READ COMMITTED DO BABELFISH VERSUS READ COMMITTED SNAPSHOT ISOLATION LEVEL DO SQL SERVER
Transação 1 | Transação 2 | Read Committed Snapshot do SQL Server | Read Committed do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
||
INSERT INTO employee VALUES (4, 'D', 40); |
|||
UPDATE employee SET age = 99; |
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. |
|
COMMIT |
Confirmação bem-sucedida. A transação 2 agora está desbloqueada. |
Confirmação bem-sucedida. |
|
SELECT * FROM employee; |
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. |
REPEATABLE READ DO BABELFISH VERSUS REPEATABLE READ ISOLATION LEVEL DO SQL SERVER
Transação 1 | Transação 2 | Repeatable Read do SQL Server | Repeatable Read do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
||
SELECT * FROM employee; |
|||
UPDATE employee SET name='A_TXN1' WHERE id=1; |
|||
SELECT * FROM employee WHERE id != 1; |
|||
SELECT * FROM employee; |
A transação 2 permanece bloqueada até que a Transação 1 seja confirmada. |
A transação 2 prossegue normalmente. |
|
COMMIT |
|||
SELECT * FROM employee; |
A atualização da Transação 1 está visível. |
A atualização da Transação 1 não está visível. |
|
COMMIT |
|||
SELECT * FROM employee; |
vê a atualização da Transação 1. |
vê a atualização da Transação 1. |
Transação 1 | Transação 2 | Repeatable Read do SQL Server | Repeatable Read do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
||
UPDATE employee SET name='A_TXN1' WHERE id=1; |
|||
UPDATE employee SET name='A_TXN2' WHERE id=1; |
Transação 2 bloqueada. |
Transação 2 bloqueada. |
|
COMMIT |
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. |
|
COMMIT |
Confirmação bem-sucedida. |
A transação 2 já foi cancelada. |
|
SELECT * FROM employee; |
Row with id=1 has name='A_TX2'. |
Row with id=1 has name='A_TX1'. |
Transação 1 | Transação 2 | Repeatable Read do SQL Server | Repeatable Read do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
||
SELECT * FROM employee; |
|||
INSERT INTO employee VALUES (4, 'NewRowName', 20); |
A transação 2 prossegue sem nenhum bloqueio. |
A transação 2 prossegue sem nenhum bloqueio. |
|
SELECT * FROM employee; |
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
|
COMMIT |
|||
SELECT * FROM employee; |
A nova linha inserida pela transação 2 está visível. |
A nova linha inserida pela transação 2 não está visível. |
|
COMMIT |
|||
SELECT * FROM employee; |
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
Transação 1 | Transação 2 | Repeatable Read do SQL Server | Repeatable Read do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
||
UPDATE employee SET age = 100 WHERE age IN (SELECT MIN(age) FROM employee); |
A transação 1 atualiza a linha com id 1. |
A transação 1 atualiza a linha com id 1. |
|
UPDATE employee SET age = 0 WHERE age IN (SELECT MAX(age) FROM employee); |
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. |
|
SELECT * FROM employee; |
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. |
|
COMMIT |
A transação 2 agora está desbloqueada. |
Confirmação bem-sucedida. |
|
COMMIT |
|||
SELECT * FROM employee; |
As duas transações executam a atualização na linha com id = 1. |
Linhas diferentes são atualizadas pelas transações 1 e 2. |
SERIALIZABLE DO BABELFISH VERSUS SERIALIZABLE ISOLATION LEVEL DO SQL SERVER
Transação 1 | Transação 2 | Serializable do SQL Server | Serializable do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
||
SELECT * FROM employee; |
|||
INSERT INTO employee VALUES (4, 'D', 35); |
A transação 2 permanece bloqueada até que a Transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
SELECT * FROM employee; |
|||
COMMIT |
A transação 1 foi confirmada com êxito. A transação 2 agora está desbloqueada. |
A transação 1 foi confirmada com êxito. |
|
COMMIT |
|||
SELECT * FROM employee; |
A linha recém-inserida está visível. |
A linha recém-inserida está visível. |
Transação 1 | Transação 2 | Serializable do SQL Server | Serializable do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
||
INSERT INTO employee VALUES (4, 'D', 40); |
|||
UPDATE employee SET age =99 WHERE id = 4; |
A transação 1 permanece bloqueada até que a Transação 2 seja confirmada. |
A transação 1 prossegue sem nenhum bloqueio. |
|
COMMIT |
A transação 2 foi confirmada com êxito. A transação 1 agora está desbloqueada. |
A transação 2 foi confirmada com êxito. |
|
COMMIT |
|||
SELECT * FROM employee; |
A linha recém-inserida é visível com valor de idade = 99. |
A linha recém-inserida é visível com valor de idade = 40. |
Transação 1 | Transação 2 | Serializable do SQL Server | Serializable do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
||
INSERT INTO employee VALUES (4, 'D', 40); |
|||
INSERT INTO employee VALUES ((SELECT MAX(id)+1 FROM employee), 'E', 50); |
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. |
|
COMMIT |
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. |
|
COMMIT |
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/gravação entre as transações. |
|
SELECT * FROM employee; |
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.
Transação 1 | Transação 2 | Serializable do SQL Server | Serializable do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
||
SELECT * FROM employee; |
|||
UPDATE employee SET age=5 WHERE age=10; |
|||
SELECT * FROM employee; |
A transação 2 permanece bloqueada até que a Transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
UPDATE employee SET age=35 WHERE age=30; |
|||
COMMIT |
A transação 1 foi confirmada com êxito. |
A transação 1 é confirmada primeiro e pode ser confirmada com êxito. |
|
COMMIT |
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. |
|
SELECT * FROM employee; |
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. Por exemplo, vamos considerar o 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 no SQL Server | Nível de isolamento do Babelfish |
---|---|---|---|
INICIAR TRANSAÇÃO |
INICIAR TRANSAÇÃO |
||
SET TRANSACTION ISOLATION LEVEL SERILAIZABLE; |
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
||
SELECT * FROM employee; |
|||
UPDATE employee SET age=5 WHERE age=10; |
|||
SELECT * FROM employee; |
A transação 2 permanece bloqueada até que a transação 1 seja confirmada. |
A transação 2 prossegue sem nenhum bloqueio. |
|
UPDATE employee SET age=35 WHERE age=30; |
|||
COMMIT |
A transação 1 foi confirmada com êxito. |
A transação 1 foi confirmada com êxito. |
|
COMMIT |
A transação 2 foi confirmada com êxito. |
A transação 2 foi confirmada com êxito. |
|
SELECT * FROM employee; |
As alterações das duas transações estão visíveis. |
As alterações das duas transações estão visíveis. |