Como resolver o erro “ERRO: 1023 DETALHE: Violação de isolamento serializável na tabela no Redshift”?

4 minuto de leitura
0

Se eu executo operações simultâneas do Amazon Redshift em sessões diferentes, recebo a mensagem “ERRO: 1023 DETALHE: Violação de isolamento serializável na tabela no Redshift.” Como resolver esse erro?

Descrição resumida

Operações de gravação simultâneas no Amazon Redshift devem ser serializáveis. Isso significa que deve ser possível que as transações sejam executadas em série em pelo menos uma ordem que produza os mesmos resultados como se as transações fossem executadas simultaneamente. Para obter mais informações, consulte Isolamento serializável.

Use um ou todos os seguintes métodos para resolver erros de isolamento serializáveis:

  • Mover operações que não precisam estar na mesma transação a fim de obter atomicidade para que fiquem fora da transação
  • Forçar a serialização bloqueando todas as tabelas em cada sessão
  • Usar isolamento de snapshots para transações simultâneas

Resolução

Mover operações que não precisam estar na mesma transação a fim de obter atomicidade para que fiquem fora da transação

Use 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. Por exemplo, suponha que duas sessões iniciem uma transação cada uma:

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

O resultado da instrução SELECT em cada transação pode ser afetado pela instrução INSERT na outra. Se executado em série, em qualquer ordem, o resultado de uma instrução SELECT sempre retornará uma linha mais do que se as transações fossem executadas simultaneamente. Como não há uma ordem possível de executar operações em série de forma a produzir o mesmo resultado de uma execução simultânea, a última operação executada resulta em um erro de isolamento serializável:

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

Se o resultado das instruções SELECT não for importante (ou seja, a atomicidade das operações nas transações não é importante), mova as instruções SELECT para que elas fiquem fora das transações. Por exemplo:

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;

Nesses exemplos, não há referências cruzadas nas transações. As duas instruções INSERT não afetam uma à outra. Como há pelo menos uma ordem em que as transações podem ser executadas em série e produzir o mesmo resultado como se fossem executadas simultaneamente, as transações são serializáveis.

Forçar a serialização bloqueando todas as tabelas em cada sessão

O comando LOCK bloqueia operações que podem resultar em erros de isolamento serializáveis. Ao usar o comando LOCK, certifique-se de fazer o seguinte:

  • Bloqueie todas as tabelas afetadas pela transação, incluindo aquelas afetadas pelas instruções SELECT somente para leitura dentro da transação.
  • Bloqueie as tabelas na mesma ordem, independentemente da ordem em que as operações são executadas.
  • Bloqueie todas as tabelas no início da transação, antes de realizar qualquer operação.

Usar isolamento de snapshots para transações simultâneas

A opção SERIALIZABLE implementa serialização estrita, na qual uma transação pode falhar quando o resultado não pode ser mapeado para uma ordem serial das transações em execução simultânea.

A opção SNAPSHOT ISOLATION permite maior simultaneidade, na qual modificações simultâneas em diferentes linhas na mesma tabela podem ser concluídas com êxito.

As transações, ou um snapshot, continuam operando na última versão confirmada do banco de dados.

O isolamento do snapshot é definido no banco de dados usando o parâmetro ISOLATION LEVEL no comando CREATE DATABASE ou ALTER DATABASE.

Para visualizar o modelo de simultaneidade que seu banco de dados está usando, execute o seguinte exemplo de 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;

Considere o seguinte ao alterar o nível de isolamento de um banco de dados:

  • Você deve ter o privilégio de superuser ou CREATE DATABASE do banco de dados atual para alterar o nível de isolamento do banco de dados.
  • Você não pode alterar o nível de isolamento do ambiente de banco de dados do DEV.
  • Você não pode alterar o nível de isolamento em um bloco de transação.
  • O comando de alteração do nível de isolamento falhará se outros usuários estiverem conectados ao banco de dados.
  • O comando de alteração do nível de isolamento poderá alterar as configurações do nível de isolamento da sessão atual.

Informações relacionadas

Gerenciamento de operações de gravação simultâneas

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos