Eu tenho um aplicativo para depurar que executa algumas dezenas de operações em um banco de dados MySQL. Essas operações são realizadas em uma única transação. Eu preciso saber o estado do banco de dados durante a depuração em um ponto de interrupção específico.
Posso fazer login no serviço MySQL usando a mysql
ferramenta CLI comum. Vejo que uma transação em andamento:
mysql> SELECT * FROM information_schema.innodb_trx\G
*************************** 1. row ***************************
trx_id: 325090
trx_state: RUNNING
trx_started: 2022-09-14 12:10:32
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 30
trx_mysql_thread_id: 26
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 10
trx_lock_structs: 26
trx_lock_memory_bytes: 1128
trx_rows_locked: 43
trx_rows_modified: 4
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 0
trx_is_read_only: 0
trx_autocommit_non_locking: 0
trx_schedule_weight: NULL
1 row in set (0.01 sec)
Agora, como posso ingressar nessa transação para consultar o estado do banco de dados durante a transação?
Como solução alternativa, eu poderia adicionar uma consulta ao código do aplicativo. No entanto, isso exige que eu saiba qual consulta quero executar antes de executar o aplicativo e, em seguida, recompile o aplicativo para cada consulta que desejo executar. Ter uma CLI aberta para depurar seria muito útil.
O banco de dados é MySQL 8.0 rodando no Debian.
O usuário JD respondeu em um comentário, estou colocando as informações aqui para o meu futuro eu e outros. Se JD postar de volta com uma resposta, eu vou aceitar.
O termo para ler transações não confirmadas é Dirty Read. Para realizar uma leitura suja, o nível Read Uncommitted Isolation precisa ser habilitado.