4

假设我有一个名为“用户”的表。我有一个在插入“用户”表时触发的触发器。 有没有办法在触发器内获取插入的事务 id?

4

2 回答 2

7

您可以使用该功能dbms_transaction.local_transaction_id

这是一个例子:(取自这里

SELECT dbms_transaction.local_transaction_id
FROM dual;

CREATE TABLE t (
testcol NUMBER(3));

INSERT INTO t
VALUES (1);

SELECT dbms_transaction.local_transaction_id
FROM dual;

CREATE OR REPLACE FUNCTION atf RETURN VARCHAR2 IS
 PRAGMA AUTONOMOUS_TRANSACTION;
 x VARCHAR2(20);
BEGIN
  INSERT INTO t
  (testcol)
  VALUES
  (2);

  x := dbms_transaction.local_transaction_id;
  COMMIT;

  RETURN x;
END atf;
/

set serveroutput on

DECLARE
 x VARCHAR2(20);
BEGIN
  x := atf;
  dbms_output.put_line(x);

  INSERT INTO t VALUES (3);

  x := dbms_transaction.local_transaction_id;
  dbms_output.put_line(x);
  COMMIT;
END;
/
于 2013-08-30T14:23:01.690 回答
2

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

SELECT 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的当前运行。transaction identifierxidv$transaction

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

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

于 2019-01-16T20:07:51.490 回答