Oracle AI Database 26ai— 自动事务回滚(具有高、中、低优先级的优先事务)
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_priority | string | HIGH |
txn_auto_rollback_mode | string | ROLLBACK |
txn_auto_rollback_high_priority_wait_target | integer | 2147483647 |
txn_auto_rollback_medium_priority_wait_target | integer | 2147483647 |
-
txn_priority– 为当前会话设置事务优先级(HIGH、MEDIUM、LOW)。默认所有事务为HIGH,即不会自动回滚。SQL> alter session set txn_priority = {HIGH | MEDIUM | LOW}; -
txn_auto_rollback_high_priority_wait_target– HIGH‑优先级事务在等待 LOW 或 MEDIUM 事务时的最大秒数,超过后低优先级事务将被回滚并终止其会话。
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_PRIORITY、TXN_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"