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

Oracle 每行之后vs每行之前触发 (锁定)

ASKTOM 2019-10-22
310

问题描述

在早期版本的Oracle documentation中,有一个关于每行之前和每行触发之后的区别的注释 (除了显而易见的,在DML在该行上执行之后,每行触发触发之后,您无法更新: new pseudorecord)。10g文档中的注释指出: “与行触发之前不同,行触发之后锁定行。”(https://docs.oracle.com/cd/B19306_01/server.102/b14220/triggers.htm#i6052)

但是,我在12cR2或19c文档中找不到相同的注释。所以,我有两个问题:

-这仍然适用于12cR2/19c吗?
-提到的锁是在DML期间获得的锁的扩展 (或释放延迟) 吗?或者,是触发器获得的单独锁吗?

专家解答

我认为这是有原因的…… 我很确定从来没有这种情况。在整个语句期间,一行被锁定,而不仅仅是 “某些” 触发器。我们可以很容易地测试:

SQL> create table t  (x int );

Table created.

SQL> insert into t values (1);

1 row created.

SQL> commit;

Commit complete.

SQL>
SQL> create or replace trigger TRG1
  2  before update on t
  3  for each row
  4  begin
  5    dbms_lock.sleep(30);
  6  end;
  7  /

Trigger created.
复制


现在,如果 “更新之前” 没有锁定,那么在触发器运行之前,我将有30秒的时间抓住该行。但如果我这样做:

会话1: SQL> 更新t集x = 10;
会话2: SQL> 从t中选择 * 进行更新;

第二个立即被阻止...
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论