Oracle AI Database 26ai— 自动事务回滚(具有高、中、低优先级的优先事务)

发布: (2025年12月26日 GMT+8 04:52)
4 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将为您翻译成简体中文,并保留原始的格式、Markdown 语法以及技术术语。谢谢!

当两个用户更新同一记录时的阻塞

如果两个用户尝试修改同一行,后发出 UPDATE 的会话会被阻塞,直到第一个会话结束其事务。

Session 1

SQL> select sid from v$mystat where rownum = 1;
SID
----
2190

SQL> update USEF.TBL1 set id = 1;
1 row updated

Session 2

SQL> select sid from v$mystat where rownum = 1;
SID
----
944

SQL> update USEF.TBL1 set id = 1;
Executing…

可以通过 v$lock 观察到阻塞情况:

SQL> select SID, ID1, ID2, LMODE, BLOCK, REQUEST
       from v$lock
      where type = 'TX';

SID   ID1      ID2   LMODE  BLOCK  REQUEST
----  -------- ----  -----  -----  -------
944   458766   2511      0      0        6
2190  458766   2511      6      1        0

如果等待的事务更重要怎么办?

Oracle Database AI 26ai 开始,Oracle 提供了可以在可配置的等待时间后自动回滚低优先级事务的参数,从而让高优先级事务继续执行。

自动事务回滚参数

参数类型默认
txn_prioritystringHIGH
txn_auto_rollback_modestringROLLBACK
txn_auto_rollback_high_priority_wait_targetinteger2147483647
txn_auto_rollback_medium_priority_wait_targetinteger2147483647
  • txn_priority – 为当前会话设置事务优先级(HIGHMEDIUMLOW)。默认所有事务为 HIGH,即不会自动回滚。

    SQL> alter session set txn_priority = {HIGH | MEDIUM | LOW};
  • txn_auto_rollback_high_priority_wait_targetHIGH‑优先级事务在等待 LOWMEDIUM 事务时的最大秒数,超过后低优先级事务将被回滚并终止其会话。

Source:

演示场景

1. 将等待目标设置为 40 秒

SQL> alter system set txn_auto_rollback_high_priority_wait_target = 40;
System altered.

2. 会话 1 – LOW 优先级事务

-- Session 1
SQL> select sid from v$mystat where rownum = 1;
SID
----
1391

SQL> alter session set txn_priority = LOW;
Session altered.

SQL> update USEF.TBL1 set id = 1391 where id = 1;
1 row updated.

3. 会话 2 – 同样是 LOW 优先级(将被阻塞)

-- Session 2
SQL> select sid from v$mystat where rownum = 1;
SID
----
1408

SQL> alter session set txn_priority = LOW;
Session altered.

SQL> update USEF.TBL1 set id = 1408 where id = 1;
Executing…

可以看到阻塞情况:

SQL> select sid, event, seconds_in_wait, blocking_session
       from v$session
      where event like '%enq%';

4. 会话 3 – HIGH 优先级(将抢占 LOW 的事务)

-- Session 3
SQL> select sid from v$mystat where rownum = 1;
SID
----
2910

SQL> alter session set txn_priority = HIGH;
Session altered.

SQL> update USEF.TBL1 set id = 2910 where id = 1;
Executing…

会话 3 也被会话 1391 阻塞,但由于它的优先级更高,最多在 40 秒后会被释放并获取该行。

SQL> select sid, event, seconds_in_wait, blocking_session
       from v$session
      where event like '%enq%';

监控功能

v$transaction 添加了两个新列(TXN_PRIORITYTXN_PRIORITY_WAIT_TARGET):

SQL> select ADDR, txn_priority, txn_priority_wait_target
       from v$transaction;

ADDR                TXN_PRIORITY  TXN_PRIORITY_WAIT_TARGET
------------------- ------------ ------------------------
0000000085CA11A0    HIGH         40

结果

在等待 40 秒后,session 3 获得了该行,低优先级的会话被终止:

-- Session 3
SQL> update USEF.TBL1 set id = 2910 where id = 1;
1 row updated.

-- Session 1
SQL> select sid from v$mystat where rownum = 1;
ORA-03113: end-of-file on communication channel

-- Session 2
SQL> select sid from v$mystat where rownum = 1;
ORA-03113: end-of-file on communication channel

警报日志条目

TEHRANPDB(3):Session (sid: 1391, serial: 61119, xid: 1.0.17832, txn_priority: "LOW")
 terminated by transaction (sid: 2910, serial: 43419, xid: -1.-1.-1, txn_priority: "HIGH")
 because of the parameter "txn_auto_rollback_high_priority_wait_target = 40"
2023-08-23T12:23:48.287763+04:30
TEHRANPDB(3):Session (sid: 1408, serial: 35823, xid: 9.27.23564, txn_priority: "LOW")
 terminated by transaction (sid: 2910, serial: 43419, xid: -1.-1.-1, txn_priority: "HIGH")
 because of the parameter "txn_auto_rollback_high_priority_wait_target = 40"
Back to Blog

相关文章

阅读更多 »

Oracle 合并 INTO

!Forem 徽标 https://media2.dev.to/dynamic/image/width=65,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%...

步骤2

查询过滤器https://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2...

比较3

sql SELECT 'ONLY_IN_US_1' AS location, t1.table_name FROM dba_tables t1 LEFT JOIN dba_tables t2 ON t1.table_name = t2.table_name AND t2.owner = 'GL...