Quando executo operações simultâneas do Amazon Redshift em sessões diferentes, recebo o erro "Serializable isolation violation on table" ou "Relation does not exist".
Breve descrição
As operações de gravação simultâneas no Amazon Redshift devem ser serializáveis a fim de que as transações possam ser executadas subsequentemente. A execução serial também deverá produzir os mesmos resultados que as transações executadas simultaneamente. Para mais informações, consulte Isolamento serializável.
Resolução
A fim de resolver os erros de isolamento serializável, utilize um dos métodos a seguir.
Tente novamente as transações canceladas
Se o Amazon Redshift detectar que um workload simultâneo não é serializável, pode haver lacunas na lógica da aplicação. Tente novamente a transação cancelada que causou o erro.
Use confirmações intermediárias
Quando uma confirmação ou reversão são emitidas, a transação é concluída. Se uma transação for confirmada antes da execução da operação de exclusão da tabela, uma nova transação será criada e o isolamento serializável será preservado.
O exemplo a seguir usa um comando COMMIT intermediário:
DELETE FROM XXXXX WHERE date = XXXXX';
→COMMIT;
BEGIN TRANSACTION;
DELETE FROM XXXXX WHERE date = XXXXX';
Mova operações não atômicas para fora da transação
Utilize esse método quando operações individuais dentro de duas transações fizerem referência cruzada, de uma forma que possa afetar o resultado da outra transação.
Quando os resultados não necessitarem ser atômicos com outras operações, mova as instruções SELECT para fora de suas transações.
O exemplo a seguir move as instruções SELECT para fora de suas transações:
Session1_Redshift=# BEGIN;Session1_Redshift = # insert into tab1 values (1)Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;
As transações anteriores são serializáveis. Se você executar as transações em sequência, os resultados serão os mesmos que você obtém quando as executa simultaneamente.
Bloqueie todas as tabelas em cada sessão para forçar a serialização
O comando LOCK bloqueia operações que podem resultar em erros de isolamento serializáveis. Ao executar o comando LOCK, conclua as seguintes etapas:
- Bloqueie todas as tabelas que a transação afeta e inclua tabelas que instruções SELECT somente de leitura dentro da transação afetam.
- Bloqueie as tabelas na mesma ordem, independentemente da ordem em que as operações são executadas.
- Antes de realizar operações, bloqueie todas as tabelas que estão no início da transação.
Utilize o isolamento de snapshots para transações simultâneas
O isolamento serializável implementará a serialização estrita. Uma transação pode falhar quando o Amazon Redshift não for capaz de mapear o resultado em uma ordem serial das transações em execução simultânea.
O isolamento de snapshots permite maior simultaneidade para que modificações na mesma tabela, mas em linhas diferentes, possam ser concluídas com êxito.
As transações continuarão a operar na última versão confirmada ou snapshot do banco de dados.
O isolamento de snapshots é definido no banco de dados e inclui o parâmetro ISOLATION LEVEL no comando CREATE DATABASE ou ALTER DATABASE.
Para visualizar o modelo de simultaneidade que seu banco de dados está utilizando, execute a seguinte consulta STV_DB_ISOLATION_LEVEL:
SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
Ao alterar o nível de isolamento de um banco de dados, utilize as práticas recomendadas a seguir:
- Para alterar o nível de isolamento do banco de dados, você deve ter o superusuário ou a permissão CREATE DATABASE.
- Não é possível alterar o nível de isolamento do ambiente no banco de dados.
- Não é possível alterar o nível de isolamento em um bloco de transação.
- O comando alter do nível de isolamento falhará quando outros usuários se conectarem ao banco de dados.
- O comando alter do nível de isolamento poderá alterar as configurações de nível de isolamento da sessão atual.
Para mais informações, consulte Como corrigir erros de isolamento serializável.
Informações relacionadas
ERROR:1023 DETAIL: Violação de isolamento serializável em uma tabela no Redshift
ERROR:1018 DETAIL: A relação não existe
Gerenciamento de operações de gravação simultâneas