我已经在Google上四处浏览,但找不到任何相关内容。基本上,我想掌握长期运行的事务。
[现在,我浏览information_schema.INNODB_TRX
或查看show engine innodb status
的输出以找到trx_id
,然后打开general_logs
以查看所有查询正在运行。
[有没有办法,我可以使用transaction_id
或jdbc
在代码中保留此hibernate
,以便可以将其记录在服务器日志中?
由于这是一个非常普遍的要求,所以我写了this article来详细介绍该主题。
使用Oracle时,必须执行以下SQL查询:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
视图提供有关当前正在运行的数据库事务的信息。但是,我们的系统中可能有多个事务正在运行,这就是为什么我们将v$transaction
与v$session
视图结合在一起。]
v$session
视图提供有关我们当前会话或数据库连接的信息。通过在v$transaction
和v$session
视图之间匹配会话地址,我们可以找到xid
视图中v$transaction
列给出的当前正在运行的事务标识符。
由于xid
列的类型为RAW
,因此我们正在使用RAWTOHEX
将交易标识符二进制值转换为其十六进制表示形式。
Oracle仅在需要分配撤消段时才分配事务标识符,这意味着已执行了INSERT,UPDATE或DELETE DML语句。
因此,只读事务将不会分配事务标识符。有关撤消日志的更多详细信息,请签出this article。
SQL Server
使用SQL Server时,只需执行以下SQL查询:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
由于
CURRENT_TRANSACTION_ID
函数返回BIGINT
列值,因此我们正在使用CONVERT
来获取其String表示形式。PostgreSQL
使用PostgreSQL Server时,您可以执行以下SQL查询以获取当前的事务ID:
SELECT CAST(txid_current() AS text)
由于
txid_current
函数返回BIGINT
列值,因此我们正在使用CAST
来获取其String表示形式。MySQL和MariaDB
使用MySQL或MariaDB时,您可以执行以下SQL查询以获取当前的事务ID:
SELECT tx.trx_id FROM information_schema.innodb_trx tx WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
目录中的information_schema
视图提供有关当前正在运行的数据库事务的信息。由于我们的系统中可能正在运行多个事务,因此我们需要通过将会话或数据库连接标识符与当前正在运行的会话进行匹配来过滤事务行。就像Oracle一样,从MySQL 5.6开始,只有读写事务才会获得事务标识符。
由于分配事务ID具有给定的开销,因此只读事务将跳过此过程。有关更多详细信息,请查看this article。
此只读事务优化在MariaDB中的工作方式相同,这意味着仅将事务ID分配给读写事务。
使用HyperSQL数据库时,可以执行以下SQL查询以获取当前的事务ID:
VALUES (TRANSACTION_ID())
使用MDC记录交易ID
事务ID对于日志记录很有用,因为它允许我们聚合在给定数据库事务的上下文中执行的所有操作。
假设我们已经将上述SQL查询封装在transactionId
方法中,我们可以提取当前事务ID并将其作为MDC变量传递给Logger框架。
因此,对于SLF4J,您可以使用put
方法,如以下示例所示:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC(映射诊断上下文)用于将
ThreadLocal
记录到Java线程中。基本上,MDC允许您注册局限于当前运行线程的键/值对,并且在日志记录框架生成日志消息时可以引用这些键/值对。要将“ txId”日志变量打印到日志,我们需要在日志附加程序模式中包括此变量:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>TRACE</level> </filter> <encoder> <Pattern>%-5p [%t]:%X{txId} %c{1} - %m%n</Pattern> <charset>UTF-8</charset> </encoder> </appender>
%X{txId}
模式用于引用txId
对数变量。有关MDC日志记录的更多详细信息,您可以阅读this article。