Estou desenvolvendo um software que lança vários clientes simultâneos para se conectar a um banco de dados PostgreSQL (12). Quando cada cliente é iniciado, a primeira coisa que ele faz ao se conectar ao PostgreSQL é executar o script de criação do esquema.
Este script foi escrito de forma idempotente - pelo menos em princípio - para que os vários clientes não tropecem em si mesmos. Em geral, isso funciona bem. No entanto, o PostgreSQL às vezes detecta deadlocks e falha de cliente(s) afetado(s). Examinando o registro, acredito que ocorram nessa sequência:
- Cliente A: Iniciar a transação de criação do esquema
- Cliente A: Concluir a transação de criação do esquema
- Cliente B: Iniciar a transação de criação do esquema
- Cliente A: Nova transação que usa esquema (selecione na visualização)
- Cliente A e B agora em deadlock
Os logs não estão 100% claros e não consigo reproduzir isso de forma determinística, mas parece ser o que está acontecendo: o cliente A está tentando a SELECT
partir de uma visão definida pelo esquema, mas está travando porque o cliente B está tentando recriar isso view ( CREATE OR REPLACE VIEW
) no script de esquema.
É possível garantir que o script de criação de esquema seja executado exclusivamente? Ou existe alguma outra solução (por exemplo, em vez de CREATE OR REPLACE VIEW
, eu apenas CREATE VIEW
uma vez que determinei que ainda não existe)?