暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SELECT语句后的事务

ASKTOM 2021-07-21
1012

问题描述

嗨,汤姆。
我正在研究在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” 命令。

我们也许可以通过这个演示更容易地看到

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论