在本文中,我将向您展示如何获取当前数据库事务ID。事务ID对于日志记录非常有用,尤其是如果要关联在同一数据库事务的上下文中执行的多个日志条目。
事务基础
在关系数据库中,事务是必需的。即使您没有声明数据库事务,您仍然会被默认使用了一个事务。
您可自己配置的唯一事务是事务范围作用域。因此,如果您未明确声明事务边界,则每个SQL语句将在其自己的数据库事务中执行,这意味着您将使用自动提交模式。
但是,大多数情况下,业务用例需要执行多个SQL语句,在这种情况下,自动提交模式将阻止数据库能够回滚在当前运行的业务用例的上下文中执行的所有语句。
因此,服务层方法使用注释进行@Transactional注释。在执行@Transactional方法时,在当前业务用例的上下文中执行的所有SQL语句将共享相同的数据库事务。
获取事务ID
您可以使用特定于数据库的SQL查询从数据库中获取数据库事务标识符。
Oracle
使用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