Solucionar problemas de erros de isolamento serializável - Amazon Redshift

O Amazon Redshift não permitirá mais a criação de funções definidas pelo usuário (UDFs) do Python a partir de 1.º de novembro de 2025. Se quiser usar UDFs do Python, você deve criá-las antes dessa data. As UDFs do Python existentes continuarão a funcionar normalmente. Para ter mais informações, consulte a publicação de blog .

Solucionar problemas de erros de isolamento serializável

ERROR:1023 DETAIL: Violação de isolamento serializável em uma tabela no Redshift

Quando o Amazon Redshift detecta um erro de isolamento serializável, você vê uma mensagem de erro como a seguir.

ERROR:1023 DETAIL: Serializable isolation violation on table in Redshift

Para resolver um erro de isolamento serializável, você pode tentar um dos seguintes métodos:

  • Tente executar a transação cancelada novamente.

    O Amazon Redshift detectou que um workload simultâneo não é serializável. Ele sugere lacunas na lógica da aplicação, que geralmente podem ser contornadas repetindo a transação que encontrou o erro. Se o problema persistir, tente um dos outros métodos.

  • Mova todas as operações que não precisam estar na mesma transação atômica para fora da transação.

    Este método é aplicável quando operações individuais em duas transações diferentes fazem referências cruzadas de maneira que possa afetar os resultados. Por exemplo, as duas sessões a seguir iniciam uma transação.

    Session1_Redshift=# begin;
    Session2_Redshift=# begin;

    O resultado de uma instrução SELECT em uma transação pode ser afetado por uma instrução INSERT na outra. Ou seja, suponhamos que você esteja executando as seguintes instruções em série, em qualquer ordem. Em todo caso, o resultado é uma das instruções SELECT retornar uma linha a mais do que ocorreria caso as transações fossem executadas simultaneamente. Não há ordem na qual as operações possam ser executadas em série e ainda obter o mesmo resultado da execução simultânea. Portanto, 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;

    Muitas vezes, o resultado das instruções SELECT não é relevante. Ou seja, a atomicidade das operações nas transações não é importante. Nesses casos, mova as instruções SELECT para fora das transações, conforme mostrado nos exemplos a seguir.

    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. Nesses exemplos, há pelo menos uma ordem na qual as transações podem ser executadas em série e obter o mesmo resultado da execução simultânea. Isso significa que as transações são serializáveis.

  • Bloqueie todas as tabelas nas sessões para forçar a serialização.

    O comando LOCK bloqueia as operações que podem resultar em erros de isolamento serializado. Ao usar o comando LOCK, faça o seguinte:

    • Bloqueie todas as tabelas afetadas pela transação, incluindo aquelas afetadas por instruções SELECT somente leitura na transação.

    • Bloqueie as tabelas na mesma ordem, independentemente da ordem na qual as operações são executadas.

    • Bloqueie todas as tabelas no início da transação, antes de executar qualquer operação.

  • Use o isolamento de snapshot para transações simultâneas

    Use um comando ALTER DATABASE com isolamento de snapshot. Para obter mais informações sobre o parâmetro SNAPSHOT para ALTER DATABASE, consulte Parâmetros.

ERROR:1018 DETAIL: A relação não existe

Ao executar operações simultâneas do Amazon Redshift em sessões diferentes, uma mensagem de erro semelhante a seguinte é exibida.

ERROR: 1018 DETAIL: Relation does not exist.

As transações no Amazon Redshift seguem o isolamento de snapshot. Após o início de uma transação, o Amazon Redshift obtém um snapshot do banco de dados. Para todo o ciclo de vida da transação, a transação opera no estado do banco de dados conforme refletido no snapshot. Se a transação lê de uma tabela que não existe no snapshot, ela lança a mensagem de erro 1018 mostrada anteriormente. Mesmo quando outra transação concorrente cria uma tabela após a transação ter obtido o snapshot, a transação não pode ler a partir da tabela recém-criada.

Para resolver este erro de isolamento de serialização, você pode tentar mover o início da transação para um ponto onde você sabe que a tabela existe.

Se a tabela é criada por outra transação, esse ponto é pelo menos depois que essa transação foi confirmada. Além disso, certifique-se de que nenhuma transação simultânea foi confirmada que possa ter descartado a tabela.

session1 = # BEGIN; session1 = # DROP TABLE A; session1 = # COMMIT;
session2 = # BEGIN;
session3 = # BEGIN; session3 = # CREATE TABLE A (id INT); session3 = # COMMIT;
session2 = # SELECT * FROM A;

A última operação executada como operação de leitura pela sessão2 resulta em um erro de isolamento serializável. Esse erro ocorre quando session2 tira um snapshot e a tabela já foi descartada por uma session1 confirmada. Em outras palavras, mesmo que uma sessão3 simultânea tenha criado a tabela, session2 não vê a tabela porque ela não está no snapshot.

Para resolver esse erro, é possível reordenar as sessões da forma a seguir.

session1 = # BEGIN; session1 = # DROP TABLE A; session1 = # COMMIT;
session3 = # BEGIN; session3 = # CREATE TABLE A (id INT); session3 = # COMMIT;
session2 = # BEGIN; session2 = # SELECT * FROM A;

Agora, quando session2 tira seu snapshot, session3 já foi confirmada e a tabela está no banco de dados. Session2 pode ler a partir da tabela sem qualquer erro.