Como posso cancelar uma transação JDBC em execução?

Existe uma maneira de abortar prematuramente uma transação? Diga, eu enviei um comando para o database que executa cinco minutos e depois das quatro, eu quero abortar.

O JDBC define uma maneira de enviar um sinal “parar o que você está fazendo nesta conexão” ao database?

Como mencionado por james, Statement.cancel () cancelará a execução de uma instrução em execução (select, update, etc). Os documentos JDBC dizem especificamente que Statement.cancel () é seguro para ser executado a partir de outro thread e até sugere o uso de chamá-lo em um thread de tempo limite.

Depois de cancelar a declaração, você ainda está com o trabalho de reverter a transação. Isso não está documentado como sendo seguro para executar de outro thread. O Connection.rollback () deve acontecer no thread principal fazendo todas as outras chamadas JDBC. Você pode manipular isso depois que a chamada Statement.execute … () cancelada for concluída com uma JDBCException (devido ao cancelamento).

Eu estou supondo que o que você quer fazer é impedir o seu aplicativo de bloqueio em longas consultas / transactions. Para este fim, o JDBC suporta o conceito de um tempo limite de consulta. Você pode definir o tempo limite da consulta usando isto:

 java.sql.Statement.setQueryTimeout(seconds) 

E manipule a SQLException lançada pelo método execute() revertendo a transação (é claro, isso só funcionaria se o autocommit fosse definido como false e seu driver JDBC fosse compatível com Statement.cancel ()).

Confira o Statement.cancel ().

Não, você não pode abortar usando o JDBC padrão.

Você pode tentar verificar se o seu RDBMS específico define alguma extensão para suportá-lo.