Eu tenho um código bastante complexo, que no início inicia a transação. Depois disso, várias consultas do usuário são realizadas (mais ou menos sem meu controle) e no final a transação é confirmada se tudo correr bem.
O que eu preciso é detectar se a conexão no final ainda está dentro da mesma transação , pois o código do usuário pode consultar o commit/rollback e iniciar uma nova transação.
Qual é a prática da indústria para isso? O banco de dados MySQL pode retornar algum tíquete/ID de transação? Ou a variável de transação de armazenamento MySQL apenas, que será detectável após a confirmação/reversão?
Ao usar MySQL ou MariaDB, você pode executar a seguinte consulta SQL para obter o ID da transação atual:
A
innodb_trx
exibição no catálogo information_schema fornece informações sobre as transações do banco de dados em execução no momento. Como pode haver várias transações em execução em nosso sistema, precisamos filtrar as linhas de transação comparando a sessão ou o identificador de conexão do banco de dados com a sessão em execução no momento.Observe que, a partir do MySQL 5.6, apenas as transações de leitura e gravação receberão um identificador de transação.
Como a atribuição de um ID de transação tem uma determinada sobrecarga, as transações somente leitura ignoram esse processo. Essa otimização de transação somente leitura funciona da mesma maneira no MariaDB, o que significa que um ID de transação é atribuído apenas para transações de leitura e gravação.
Para mais detalhes, confira este artigo .
Duvido que haja um id de transação. Mas aqui estão algumas "boas práticas":
Desligue a reconexão automática. (Este é um parâmetro em certas APIs ao estabelecer a conexão.) Uma desconexão encerra as transações e as reverte. Com a reconexão automática DESLIGADA, você receberá um erro no que acontecer a seguir.
Verifique se há erros após cada instrução SQL.
Evite o código espaguete. Organize o código de forma que fique óbvio que não há como fugir e fazer um
COMMIT
ouROLLBACK
. Eu gosto de ter oSTART TRANSACTION
no início de uma sub-rotina e oCOMMIT
eROLLBACK
próximo ao final. Em seguida, certifique-se de que quaisquer sub-rotinas chamadas assumam que estão dentro de uma transação.Isso pode ajudá-lo a descobrir se você iniciou outra transação em sua conexão:
ou
Colete isso logo após fazer o
BEGIN
ouSTART TRANSACTION
; colete-o novamente antes de vocêCOMMIT
para ver se ele mudou. ("Changed" == algo está errado.) Observação: estou usandoSESSION
, nãoGLOBAL
.