Estou tentando entender a relação entre os conceitos de encadeamento de transações e autocommit . A confirmação automática geralmente é exposta em uma interface programática do lado do cliente. Por exemplo, em JDBC com o método Connection#setAutoCommit .
Ou seja, gostaria de saber se:
- esses conceitos são simplesmente apelidos um do outro (e qual é a correspondência)
ou
- esses conceitos são ortogonais e todas as 4 combinações fazem sentido e produzem resultados diferentes (e quais são esses resultados)
Há vários recursos que sugerem que o caso é 1. Os mesmos recursos parecem sugerir que unchained
corresponde a autocommit on
. Por exemplo
, este post diz que:
set chained off (padrão no Sybase, = definir autocommit on)
Este post mais extenso diz da mesma forma:
Algumas interfaces de programação de banco de dados têm um modo de confirmação automática, também chamado de modo não encadeado. Nesse modo, cada instrução é uma transação e é confirmada após a execução. Se você deseja usar transações em seus aplicativos, você precisa usar o modo de confirmação manual ou o modo encadeado.
Este tem sido o meu próprio entendimento até agora. Por exemplo, sempre que tento executar (usando JDBC) um procedimento armazenado e me deparo com a seguinte mensagem:
java.sql.SQLException: O procedimento armazenado 'whatever' pode ser executado apenas no modo de transação não encadeada.
… então definindo no meu código:
conn.setAutoCommit(true);
… corrige o problema que parece confirmar que, de fato, unchained é o mesmo que autocommit .
No entanto, olhando para a documentação do Sybase ASE, lê-se:
O modo padrão, chamado modo não encadeado ou modo Transact-SQL, requer instruções de transação de início explícitas emparelhadas com instruções de transação de confirmação ou de reversão para concluir a transação.
Isso parece ser exatamente o oposto do autocommit - a menos que o texto acima seja entendido como tendo o seguinte significado:
O modo padrão, chamado modo não encadeado ou modo Transact-SQL, requer instruções de início de transação explícitas emparelhadas com instruções de transação de confirmação ou de reversão para concluir a transação quando se deseja colocar mais de uma única instrução em uma transação .
Finalmente, me deparei com este post que sugere que o encadeamento e o autocommit são principalmente ortogonais.
AutoCommit true é idêntico a chained off
AutoCommit false é idêntico a encadeado em
No modo encadeado, sua primeira instrução iniciará uma transação implícita, que permanecerá ativa até você confirmar ou reverter manualmente.
Mesmo que o manual diga que o modo padrão é desencadeado, isso não é verdade para bibliotecas cliente. Os drivers JDBC e Python usam um modo padrão de encadeado, a menos que você o substitua.