问题描述
嗨,汤姆。
我正在研究在SELECT语句作为DML运算符之后创建事务的过程。
这是一个步骤,
问题是,
我们没有任何TX锁,但交易存在。为什么?
调用DBMS_TRANSACTION.LOCAL_TRANSACTION_ID之后,我们可以在V $ transaction中看到一个新事务,但在此之前不要。为什么?
如果ISOLATION_LEVEL = 已提交,我们也看不到任何事务。为什么?
根据您出色的图书专家Oracle第8章,“交易隐含地从第一个开始
修改数据的语句 (第一个获取TX锁的语句)。”
我正在研究在SELECT语句作为DML运算符之后创建事务的过程。
这是一个步骤,
COMMIT; ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE; SELECT * FROM V$TRANSACTION; --Wait one minute to remember time of previous select execution SELECT DBMS_TRANSACTION.LOCAL_TRANSACTION_ID FROM DUAL; SELECT * FROM V$TRANSACTION; --the transaction create time is before call DBMS_TRANSACTION.LOCAL_TRANSACTION_ID
问题是,
我们没有任何TX锁,但交易存在。为什么?
调用DBMS_TRANSACTION.LOCAL_TRANSACTION_ID之后,我们可以在V $ transaction中看到一个新事务,但在此之前不要。为什么?
如果ISOLATION_LEVEL = 已提交,我们也看不到任何事务。为什么?
根据您出色的图书专家Oracle第8章,“交易隐含地从第一个开始
修改数据的语句 (第一个获取TX锁的语句)。”
专家解答
也看看这两个链接,了解更多细节
https://blogs.oracle.com/oraclemagazine/on-transaction-isolation-levels
https://asktom.oracle.com/pls/apex/asktom.search?tag=serializable-transaction-200203
但是,我们还需要尊重您 * 逻辑上 * 开始交易的时间,在您的情况下,这是 “alter session” 命令。
我们也许可以通过这个演示更容易地看到
对我们来说,直到你真正需要它的时候才去分配撤销等 (即,在v $ 交易中看到一些东西) 是有意义的,因为如果你不需要它,那就浪费了精力。但是我们确实需要记住 * 从逻辑上 * 您何时开始交易。
https://blogs.oracle.com/oraclemagazine/on-transaction-isolation-levels
https://asktom.oracle.com/pls/apex/asktom.search?tag=serializable-transaction-200203
但是,我们还需要尊重您 * 逻辑上 * 开始交易的时间,在您的情况下,这是 “alter session” 命令。
我们也许可以通过这个演示更容易地看到
SQL> select sysdate from dual;
SYSDATE
-------------------
22/07/2021 12:01:55
SQL> select start_time from v$transaction;
no rows selected
SQL> set transaction read write; <<<===== you logically started NOW, but this is just recorded in the session memory, you can't "see" it
Transaction set.
SQL> select sysdate from dual;
SYSDATE
-------------------
22/07/2021 12:01:56
SQL> exec dbms_session.sleep(20);
PL/SQL procedure successfully completed.
SQL> select sysdate from dual;
SYSDATE
-------------------
22/07/2021 12:02:16
SQL> select * from emp for update;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO G
---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- -
7369 SMITH CLERK 7902 17/12/1980 00:00:00 800 20 F
7499 ALLEN SALESMAN 7698 20/02/1981 00:00:00 1600 300 30 F
7521 WARD SALESMAN 7698 22/02/1981 00:00:00 1250 500 30 F
7566 JONES MANAGER 7839 02/04/1981 00:00:00 2975 20 F
7654 MARTIN SALESMAN 7698 28/09/1981 00:00:00 1250 1400 30 F
7698 BLAKE MANAGER 7839 01/05/1981 00:00:00 2850 30 F
7782 CLARK MANAGER 7839 09/06/1981 00:00:00 2450 10 F
7788 SCOTT ANALYST 7566 09/12/1982 00:00:00 3000 20 M
7839 KING PRESIDENT 17/11/1981 00:00:00 5000 10 M
7844 TURNER SALESMAN 7698 08/09/1981 00:00:00 1500 30 M
7876 ADAMS CLERK 7788 12/01/1983 00:00:00 1100 20 M
7900 JAMES CLERK 7698 03/12/1981 00:00:00 950 30 M
7902 FORD ANALYST 7566 03/12/1981 00:00:00 3000 20 U
7934 MILLER CLERK 7782 23/01/1982 00:00:00 1300 10 U
14 rows selected.
SQL> select start_time from v$transaction;
START_TIME
--------------------
07/22/21 12:01:55
对我们来说,直到你真正需要它的时候才去分配撤销等 (即,在v $ 交易中看到一些东西) 是有意义的,因为如果你不需要它,那就浪费了精力。但是我们确实需要记住 * 从逻辑上 * 您何时开始交易。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




