gpt4 book ai didi

oracle - 在 COMMIT 之前查看不同 SQL Oracle session 的更改?

转载 作者:行者123 更新时间:2023-12-05 08:48:47 26 4
gpt4 key购买 nike

我协调了 Oracle PL/SQL DML 脚本的实现,但要在生产中执行此操作,我通常会联系 DBA 团队让他们运行脚本,前提是他们具有适当的权限。

有没有办法让我的用户在实际提交之前看到更改?我知道这些更改将在执行脚本的 session 中生效,但是有没有办法让不同的 session 以及不同的用户看到它们?

最佳答案

包裹DBMS_XA可以将未提交的事务从一个 session 转移到另一个 session 。第二个 session 可以查看未提交的数据并可以提交、回滚或再次传递事务。以下示例基于 this oracle-base article ,虽然它对我有用,但我以前从未在生产中使用过此功能,并且可能存在我不知道的复杂情况。

首先,创建示例使用的表:

--DROP TABLE tab1;

CREATE TABLE tab1 (
id NUMBER
);

第 1 节

将事务超时从 60 秒更改为更大的值:

DECLARE
l_return PLS_INTEGER;
BEGIN
l_return := SYS.DBMS_XA.xa_settimeout(500);
END;
/

开始交易,传入一个魔数(Magic Number)来命名交易(999):

DECLARE
l_xid DBMS_XA_XID := DBMS_XA_XID(999);
l_return PLS_INTEGER;
BEGIN
l_return := SYS.DBMS_XA.xa_start(xid => l_xid,
flag => DBMS_XA.TMNOFLAGS);
END;
/

在这里做真正的工作,无需提交:

INSERT INTO tab1 (id) VALUES (1);

结束事务以便另一个 session 稍后可以附加到它:

DECLARE
l_xid DBMS_XA_XID := DBMS_XA_XID(999);
l_return PLS_INTEGER;
BEGIN
l_return := SYS.DBMS_XA.xa_end(xid => l_xid,
flag => DBMS_XA.TMSUSPEND);
END;
/

数据已从我们的 session 中消失 - 此表不包括我们刚刚插入的行。另一个 session 将需要附加到全局事务并提交或回滚。

select * from tab1;

第 2 节

最初,这个 session 看不到数据:

select * from tab1;

附加到全局事务,使用相同的魔数(Magic Number) (999):

DECLARE
l_xid DBMS_XA_XID := DBMS_XA_XID(999);
l_return PLS_INTEGER;
BEGIN
l_return := SYS.DBMS_XA.xa_start(xid => l_xid,
flag => DBMS_XA.TMRESUME);
END;
/

现在只有这个 session 可以看到新行:

select * from tab1;

第二个 session 可以提交、回滚或将事务传递给另一个 session 。要通过事务,请再次调用 DBMS_XA.XA_END 并进行另一个 session ,然后调用 DBMS_XA.XA_START

关于oracle - 在 COMMIT 之前查看不同 SQL Oracle session 的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65500207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com