Eu executo as seguintes instruções em um banco de dados Vertica, uma de cada vez:
BEGIN TRANSACTION;
UPDATE table
SET col1 = 'something'
WHERE col2 = 'something else';
SELECT COUNT(*)
FROM table
WHERE col1 = 'something';
ROLLBACK TRANSACTION;
Eu corro bem a primeira linha... OK, agora estou em uma transação.
Eu executo minha atualização... OK, funcionou.
Eu executo meu SELECT
teste para ter certeza de que as coisas funcionaram conforme o esperado... Oh, espere, parece que perdi uma condição na WHERE
cláusula da minha UPDATE
declaração.
Sem problemas! É por isso que fiz isso em uma transação.
Vamos reverter:
=> ROLLBACK TRANSACTION;
[Vertica][JDBC](10040) Cannot use commit while Connection is in auto-commit mode.
Jones, me dê aquele rolo de papel higiênico que você tem na sua mesa.
Assim, Vertica aceitou alegremente meu BEGIN TRANSACTION
, sabendo muito bem que logo depois disso eu tentaria executar um ROLLBACK
ou COMMIT
.
No entanto, não posso! Minha conexão está no modo de confirmação automática, então ROLLBACK
e COMMIT
não significa nada. O meu UPDATE
foi confirmado no momento em que foi concluído.
Eu perdi alguma coisa, ou estou certo em pensar que esta é apenas uma implementação muito ruim da parte da Vertica?
Por que o Vertica aceitaria um BEGIN TRANSACTION
em uma conexão no modo de confirmação automática se as consequências lógicas ( ROLLBACK
ou COMMIT
) são ilegais?
Vertica (na verdade, acho que a maioria, senão todos os bancos de dados) se comporta dessa maneira porque a parte que processa a
BEGIN TRANSACTION
instrução SQL, ou seja, a análise de consulta e o mecanismo de execução, não está ciente da configuração AUTOCOMMIT do cliente. Por outro lado, o cliente não está ciente do significado da string 'BEGIN TRANSACTION'.O fluxo de controle se parece com isto, supondo que o cliente de linha de comando
vsql
seja usado para executar o exemplo:vsql
e se conecta ao banco de dados.\set AUTOCOMMIT on
. Após esse momento, o cliente (vsql
) sabe emitir umaCOMMIT
instrução implícita após cada instrução bem-sucedida.BEGIN TRANSACTION
.vsql
não reconhece essa string como um de seus comandos internos e envia a string para o servidor para processamento.COMMIT
para o servidor.etc.
O suporte da Vertica reconheceu esse problema e está rastreando uma correção em VER-44735. Infelizmente, o rastreador de problemas Vertica não é visível publicamente.
A Vertica se recusou a caracterizar isso como um bug e o rotulou como uma "solicitação de novo recurso", mas, independentemente disso, isso deve ser resolvido em uma versão futura.