Como reverter automaticamente todas as transações após, por exemplo, 10 segundos?
Este parâmetro faz o trabalho?
idle_in_transaction_session_timeout
Parece bom, mas mata apenas sessões ociosas. Não há problema em matar também transações ativas, se forem muito longas? Se sim, como devo fazer isso?
O contexto é evitar deadlocks, parar sobrecargas, trazer estabilidade, etc. Claro, essa é a securitização "última chance" do banco de dados. Não substitui todas as boas práticas como observar os planos de consulta, projetar índices, restrições e conteúdo de transações, etc...
Edit: A reversão de transações automáticas globais não é uma boa ideia. Eu pretendo inserir um lado do aplicativo de tempo limite para transações de migração longas dentro do próprio cliente.
Que a transação esteja sendo executada por um longo tempo é apenas um Sintoma , não a causa raiz do problema real . Seria muito melhor descobrir por que as transações estão demorando tanto e corrigir isso .
Além disso, será muito, muito irritante para seus usuários se o trabalho deles for "aleatoriamente" eliminado pelo "computador" - espere muitas reclamações.
Uma analogia: como você "se sentiria" se o MS Word (ou qualquer processador de texto que você usa) se fechasse aleatoriamente ( sem salvar automaticamente suas alterações)? Você ficaria muito irritado com isso muito, muito rapidamente.
É quando uma transação atualiza A então quer atualizar B e outra transação atualizou B e agora quer atualizar A. Ambas as transações esperariam eternamente para que a outra terminasse, então o SGBD escolhe uma e a elimina.
Não há [muitas vezes] nada que o banco de dados possa fazer sobre isso - ele [geralmente] requer alterações no código do aplicativo para resolvê-lo.
Eliminar transações pode realmente piorar as coisas porque , quando você mata uma transação, tudo o que foi feito até aquele ponto precisa ser revertido e, muitas vezes, isso terá prioridade sobre tudo o que o banco de dados está tentando façam. (Uma vez eu tive que matar um Oracle Transaction que estava em execução por mais de oito horas - todo o banco de dados foi bloqueado por 20 minutos enquanto a reversão estava acontecendo).
Sério? Mudanças sendo "aleatoriamente" eliminadas e usuários tendo que refazer o trabalho, todo o banco de dados rodando lentamente por causa dos rollbacks "aleatórios" que estão acontecendo... Você chamaria isso de "estável"?
IMHO, esta não é uma proposta realista e de longo prazo para "proteger" seu banco de dados.
Encontre e corrija o problema real .
Portanto, toda a migração será abortada e não tentará novamente automaticamente, e você tentará novamente fora do horário comercial ou após investigar o problema? Não estou convencido de que seja uma boa ideia, mas certamente é mais plausível fazer isso em uma migração do que em um cenário global.
statement_timeout é a configuração que você deseja. Quando uma instrução expira, ela gera um erro, toda a transação será revertida automaticamente. Pode fazer mais sentido atingir o tempo limite de toda a migração, não de cada etapa individual. Mas eu não acho que haja qualquer configuração para fazer isso. Se a migração for um script de shell, talvez você possa fazer com que o shell lide com o cancelamento.