如何使用 JDBC 或 Hibernate 获取当前数据库事务 id?

2023-11-26

我在谷歌上查了一下,但找不到任何相关的东西。基本上,我想掌握长时间运行的事务。

现在,我经历information_schema.INNODB_TRX或者看看输出show engine innodb status找到trx_id然后打开general_logs查看所有正在运行的查询。

有什么办法,我可以抓住这个transaction_id在我的代码中使用jdbc or hibernate这样我就可以将其记录在我的服务器日志中?


Oracle

使用 Oracle 时,必须执行以下 SQL 查询:

SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr

The v$transaction视图提供有关当前正在运行的数据库事务的信息。但是,我们的系统中可以运行多个事务,这就是我们加入的原因v$transactionv$session view.

The v$session视图提供有关当前会话或数据库连接的信息。通过匹配之间的会话地址v$transaction and v$session视图中,我们可以找到当前正在运行的事务标识符xid栏目中的v$transaction view.

因为xid列的类型RAW,我们正在使用RAWTOHEX将事务标识符二进制值转换为其十六进制表示形式。

Oracle 仅在需要分配撤消段时才分配事务标识符,这意味着已执行 INSERT、UPDATE 或 DELETE DML 语句。

因此,只读事务不会分配事务标识符。

SQL服务器

使用 SQL Server 时,您只需执行以下 SQL 查询:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

因为CURRENT_TRANSACTION_ID函数返回一个BIGINT列值,我们正在使用CONVERT获取其字符串表示形式。

PostgreSQL

使用 PostgreSQL Server 时,可以执行以下 SQL 查询来获取当前事务 id:

SELECT CAST(txid_current() AS text)

因为txid_current函数返回一个BIGINT列值,我们正在使用CAST获取其字符串表示形式。

MySQL 和 MariaDB

当使用 MySQL 或 MariaDB 时,您可以执行以下 SQL 查询来获取当前事务 id:

SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()

The innodb_trx查看在information_schema目录提供有关当前正在运行的数据库事务的信息。由于我们的系统中可能有多个事务正在运行,因此我们需要通过将会话或数据库连接标识符与当前正在运行的会话进行匹配来过滤事务行。

就像 Oracle 的情况一样,从 MySQL 5.6 开始,只有读写事务才会获得事务标识符。

由于分配事务 ID 具有给定的开销,因此只读事务会跳过此过程。欲了解更多详情,请查看本文.

这种只读事务优化在 MariaDB 中的工作方式相同,这意味着事务 ID 仅分配给读写事务。

HSQLDB

使用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>

The %X{txId}模式用于引用txId日志变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JDBC 或 Hibernate 获取当前数据库事务 id? 的相关文章

随机推荐

  • C# 4.0 中的类属性/字段可以是匿名类型吗?

    As in public class MyClass private static var MyProp new item1 a item2 b 注意 上面的代码既不能编译也不能工作 var 不能在那里使用 它只是为了表明我的观点 Upda
  • iOS 7 中锁屏播放器的搜索栏问题

    如果我在 iOS 7 中通过 iPhone 的本机音乐播放器播放音乐并在锁定屏幕上访问它 那么我可以拖动播放器的搜索栏 即用户可以与其交互 截屏 但是 如果我从支持后台音频播放的应用程序播放音乐 则播放器的搜索栏用户交互将在锁定屏幕上禁用
  • 如何从Linux内核访问用户空间内存?

    我知道copy to user copy from user get user put user函数就是为了这个目的 我的问题是 给定一个用户空间地址 指针 我如何从内核访问该地址指向的数据 我可以想象 首先我必须确保包含的页面应该位于物理
  • 空手道-需要帮助来断言日期范围的一维数组

    我试图断言一维数组内的值 我尝试过使用 match 但看起来无法断言日期范围 下面是对象数组 2019 04 24T17 41 28 2019 04 24T17 41 27 975 2019 04 24T17 41 27 954 2019
  • 在服务器上使用socket.io和nodejs,并以apache作为反向代理

    我尝试将 Node js 与 Socket IO 结合使用来促进浏览器和客户端之间的消息传递 如下导游 但是 我必须在 Apache 后面设置 Node 反向代理 因此 我使用 example com nodejs 代替 example c
  • Google Appengine 和 rx-Java?

    rxJava 库与 Google Appengine 兼容吗 如果可以的话有什么限制吗 我发现的唯一信息是提到 grepcode 上的 部分支持 http grepcode com snapshot repo1 maven org mave
  • Android RecyclerView 选择第一个 Item

    我正在使用 RecyclerView 来实现 NavigationDrawer 我让点击事件正常工作 但我不知道如何在应用程序启动时选择第一个项目 然后即使未显示抽屉 也可以保持所选项目高亮显示 我所能找到的只是 RecyclerView
  • mysql CREATE VIEW 无法从 mysql_query 工作

    我有一个在 mysql 数据库中创建 VIEW 的代码 该代码在我的本地服务器上运行良好 它可以正常创建和裁剪视图 但在我的在线服务器上它给出了错误 CREATE VIEW command denied to user 对于在线数据库 我在
  • C#:在并行线程中设置 HttpContext.Current 有什么问题吗?

    我正在使用一个依赖于 HttpContext Current 的库 该库是 Facebook C SDK 但我的问题也应该适用于其他场景 我想从并行线程内部使用这个库 但是 HttpContext Current 在并行线程中不可用 因此我
  • Haskell 中 FFI 调用的类型自动转换

    我定义了以下模块来帮助我导出 FFI 函数 LANGUAGE MultiParamTypeClasses FunctionalDependencies TypeSynonymInstances module ExportFFI where
  • 无法制作完整的帧缓冲区对象 8cd6(iOS,以编程方式创建的 OpenGL 视图)

    我在让以编程方式创建的 OpenGL 视图在某些 iOS 版本 设备上运行时遇到问题 这似乎在越狱设备上最常见 但在普通设备上也会发生 似乎只有 v4 1 或 4 2 1 才会失败 我的设备已越狱 这不是我的 当然也不是我选择越狱的 并且装
  • C - 包含依赖项的编译

    我有一些代码想在我没有 root 访问权限的机器上运行 该机器没有运行此代码所需的一些库 有什么方法可以在编译时包含所有依赖项吗 我意识到生成的文件可能非常大 您正在寻找的是静态编译 执行静态编译将所有库包含到可执行文件本身中 因此您不必太
  • 在 Angular 2 中的对象的所有属性中搜索字符串

    如何使用 TS 在 Angular 2 中的对象的所有属性中搜索字符串 我在带有搜索框的表中呈现了一组客户 如果用户键入一个值 我想搜索所有属性值以推送与键入的值匹配的客户 export var CUSTOMER Client id 1 n
  • 在 PdfPCell 中右对齐文本

    我有一个可以生成 PDF 发票的 C 应用程序 此发票中有一个项目和价格表 这是使用生成的PdfPTable and PdfPCells 我希望能够右对齐价格列 但我似乎无法做到 文本总是在单元格中左对齐 这是我创建表的代码 PdfPTab
  • 用经度和纬度计算半径[重复]

    这个问题在这里已经有答案了 我试图确定两个位置 每个位置都有自己的纬度和经度值 彼此之间的距离是否在一定距离内 例如 3 英里半径 我有双值来表示每个位置的纬度和经度 Location 1 Double lattitude1 40 7143
  • Java Math.cos() 方法未按预期返回 0

    在 Windows 7 PC 上使用 Java 不确定这是否重要 并对应该返回 0 如 pi 2 的值调用 Math cos 而不是返回小值 但除非我误解 否则小值是与零相比远大于 1 ulp Math cos Math PI 2 6 12
  • 使用 jQuery 确定 Android 上的长按(长按、轻按按住)

    我已经能够成功播放使用 jQuery 和 HTML 页面在 Android 上实现 touchstart touchmove 和 touchend 事件 现在我想看看确定长按事件的技巧是什么 即点击并按住 3 秒 我似乎还无法弄清楚这一点
  • 如何使用 Backbone.Marionette 处理嵌套的 CompositeView?

    我正在使用 Backbone 进入更大规模的数据结构 并且遇到了通过 CompositeViews 很好地表示数据的情况 也就是说 CollectionView 周围添加了 附加内容 例如标题 按钮等 然而 我在将 CompositeVie
  • 如何创建可以从以编程方式创建的按钮调用的 Segue?

    在 Swift 中 我使用以下方法以编程方式创建了一个按钮 var button UIBarButtonItem title Tableau style Plain target self action tabBarTableauClick
  • 如何使用 JDBC 或 Hibernate 获取当前数据库事务 id?

    我在谷歌上查了一下 但找不到任何相关的东西 基本上 我想掌握长时间运行的事务 现在 我经历information schema INNODB TRX或者看看输出show engine innodb status找到trx id然后打开gen