Explain Codes LogoExplain Codes Logo

How to display open transactions in MySQL

sql
transactional-integrity
reconnection-mechanisms
transactional-anomalies
Nikita BarsukovbyNikita Barsukov·Nov 26, 2024
TLDR

Get an instant snapshot of active InnoDB transactions using the INFORMATION_SCHEMA.INNODB_TRX table:

SELECT TRX_ID, TRX_STATE, TRX_STARTED, TRX_REQUESTED_LOCK_ID, TRX_WAIT_STARTED FROM INFORMATION_SCHEMA.INNODB_TRX;

This returns critical details such as transaction IDs (TRX_ID), transaction states (TRX_STATE), and transaction initiation times (TRX_STARTED).

The state of transactions is crucial in maintaining data integrity and avoiding processing blockages. Open transactions can hold certain locks that impact concurrent operations and may give rise to deadlocks.

Threads and connections: The movers and shapers

Track thread activity live

You can monitor live thread activity using the SHOW FULL PROCESSLIST command:

SHOW FULL PROCESSLIST;

This enables you to watch transaction-supporting threads in real time and isolate potentially problematic long-running queries.

Reconnection mechanisms and their quirks

When a reconnection happens, MySQL drops the original connection, leading to a loss of session objects. The built-in auto-reconnect function in MySQL can obscure network glitches or server malfunctions.

To better manage reconnections:

  • Disable the default auto-reconnect.
  • Develop your own reconnection procedures.
  • Store the last executed query on the client-side to re-apply after a disconnection.

mysql_thread_id() can be used to verify that you're still on the original thread when trying to resume a transaction post-disconnection:

SELECT CONNECTION_ID() = mysql_thread_id() AS is_same_thread; -- Are we in the Twilight Zone?

Pro-level diagnostics: Getting transaction backstories

Transaction internals at your fingertips

Obtain high-level insight into transaction workings, including crucial information about lock requests, through:

SHOW ENGINE INNODB STATUS\G

Scroll to the TRANSACTIONS section to find granular data on each transaction, such as deadlock stats, rollback segments, and undo logs.

Handling open transactions: Count, kill, chill

Identify current open transactions and get a total count:

SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_TRX; -- How many coffee breaks?

Using this aggregate metric, you can keep an eye on the overall status of your transaction processing system. To remediate a specific transaction causing a bottleneck, be daring and use KILL <thread_id>:

KILL 12345; -- Bye-bye, 12345! You won't be missed.

NB: This operation causes an automatic rollback of all changes made by the doomed transaction, releasing any held locks.

Going the extra mile with transactions

Developing a custom reconnection routine

When devising your reconnection scheme, consider the following:

  • Using exception handling for lost connections.
  • Maintaining state coherency after reconnection.
  • Adding error checks and handling for transactional anomalies.

Keeping transactional integrity intact

Consider the following during an unexpected disruption:

  • Keeping a transaction log to resurrect state on the client side.
  • Implementing idempotent operations to prevent undesirable duplicates or peculiar data discrepancies upon transaction re-submission.

Dealing with stubborn transactions

For unyielding transactions, identify the root cause:

  • Overly long-running operations owing to unoptimized queries.
  • Shares of lock waits from other transactions.
  • Inadequate resources due to hardware constraints or sub-optimal configuration.

Each of these issues can be resolved through targeted responses like query optimization, schema changes, or infrastructure modification.

References