Priority Transaction feature - Automatic Transaction Rollback no Oracle Database 23/26ai

A partir do Oracle 23ai a oracle introduziu o "priority transaction feature", um recurso para evitar locks de forma "automatica e controlada".

Em vez de depender da intervenção manual de DBAs ou do término forçado de sessões, o Oracle agora identifica e desfaz transações de baixa prioridade que estejam bloqueando transações mais importantes por tempo excessivo. Esse processo ocorre sem gerar a desconexão da sessão que estava gerando o lock, apenas efetuando o rollback da transação.

Problema clássico, em ambientes OLTP é bastante comum que duas sessões tentem atualizar a mesma linha simultaneamente. 

Exemplo:

-- Sessão 1
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

-- Sessão 2
UPDATE employees SET salary = salary * 1.2 WHERE department_id = 10;

No exemplo acima, a segunda sessão (sessão 2) ficará bloqueada, aguardando a primeira sessão (sessão 1) ser concluída através de um commit ou rollback.

Se a primeira sessão demorar demais, ou mesmo travar, esse lock pode começar a gerar um efeito cascata ocasionando impactos para os usuários.

Até o oracle 23c, só era possível resolver esse tipo de situação de forma manual, identificando e matando a sessão bloqueadora para liberar as que estava aguardando.

O Priority Transactions

O Oracle Database 26ai consolida e aprimora uma das funcionalidades mais interessantes introduzidas no Oracle 23c: o priority transatctions — um recurso projetado para evitar contenções de bloqueios de linha (row locks) de forma automática e controlada.

Agora é possível que as transações tenham uma prioridade definida (high, medium, low) e com base nestas prioridades, o Oracle monitora as situações de bloqueios, onde se uma transação de menir prioridade gerar um bloqueio em uma de maior prioridade, por mais tempo que o permitido, o banco de dados executa automaticamente o rollback da sessão que esta gerando o bloqueio.

Esta funcionalidade é controlada pelos seguintes parâmetros de sistema:

Parâmetro Descrição
TXN_PRIORITY Define a prioridade da transação atual na sessão (HIGH, MEDIUM ou LOW). Determina a importância relativa em situações de bloqueio.
PRIORITY_TXNS_HIGH_WAIT_TARGET Tempo máximo (em segundos) que uma transação de prioridade maior aguardará antes que o Oracle inicie o rollback automático da transação bloqueadora de menor prioridade.
PRIORITY_TXNS_MEDIUM_WAIT_TARGET Tempo máximo (em segundos) que uma transação aguardará antes de o Oracle executar o rollback automático da transação bloqueadora de menor prioridade.
PRIORITY_TXNS_MODE Define o modo de operação do recurso.
Pode ser:
TRACK — o Oracle apenas monitora e registra situações de bloqueio (sem rollback). Ideal para calibração.
ROLLBACK — o Oracle executa rollback automático das transações de menor prioridade que excederem o tempo de espera configurado. Modo ativo por padrão.
Exemplos de configuração:
 
-- Definir tempos de espera
ALTER SYSTEM SET PRIORITY_TXNS_HIGH_WAIT_TARGET = 30;
ALTER SYSTEM SET PRIORITY_TXNS_MEDIUM_WAIT_TARGET = 60;

Demonstração:

  • Criação e carga da tabela de teste
[oracle@oracle26ai ~]$ ps -ef | grep pmon
oracle      2098       1  0 08:18 ?        00:00:00 db_pmon_FREE
oracle      2617    2564  0 08:20 pts/0    00:00:00 grep --color=auto pmon
[oracle@oracle26ai ~]$
[oracle@oracle26ai ~]$ . oraenv
ORACLE_SID = [oracle] ? FREE
The Oracle base has been changed from /home/oracle to /opt/oracle
[oracle@oracle26ai ~]$ sqlplus

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Oct 28 08:32:37 2025
Version 23.26.0.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 FREEPDB1                       READ WRITE NO
SQL> alter session set container=FREEPDB1;

Session altered.

SQL>  CREATE USER lab_txn IDENTIFIED BY lab_txn QUOTA UNLIMITED ON users;

User created.

SQL> GRANT CONNECT, RESOURCE TO lab_txn;

Grant succeeded.

SQL> CONN lab_txn/lab_txn@FREEPDB1
Connected.
SQL>
SQL>
SQL> CREATE TABLE employees (
   employee_id    NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
   first_name     VARCHAR2(50),
   last_name      VARCHAR2(50),
   department_id  NUMBER,
   salary         NUMBER(10,2)
);  2    3    4    5    6    7

Table created.

SQL> INSERT INTO employees (first_name, last_name, department_id, salary)
VALUES ('John', 'King', 10, 5000);  2

1 row created.

SQL> INSERT INTO employees VALUES (DEFAULT, 'Sarah', 'Smith', 10, 5200);

1 row created.

SQL> INSERT INTO employees VALUES (DEFAULT, 'Lucas', 'Brown', 20, 6100);

1 row created.

SQL> INSERT INTO employees VALUES (DEFAULT, 'Emma', 'Williams', 30, 4500);

1 row created.

SQL> COMMIT;

Commit complete.

  • Sessão 1 - Transação com prioridade baixa
[oracle@oracle26ai ~]$ sqlplus lab_txn/lab_txn@FREEPDB1

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Oct 28 08:43:41 2025
Version 23.26.0.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Last Successful login time: Tue Oct 28 2025 08:43:38 -03:00

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> ALTER SESSION SET TXN_PRIORITY = 'LOW';

Session altered.

SQL> UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

2 rows updated.

SQL> commit;
commit
*
ERROR at line 1:
ORA-63302: Transaction must roll back
ORA-63300: Transaction is automatically rolled back since it is blocking a
higher priority transaction from another session.
Help: https://docs.oracle.com/error-help/db/ora-63302/


SQL>
  • Sessão 2 - Transação com prioridade alta
[oracle@oracle26ai ~]$ sqlplus lab_txn/lab_txn@FREEPDB1

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Oct 28 08:44:13 2025
Version 23.26.0.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Last Successful login time: Tue Oct 28 2025 08:43:42 -03:00

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> ALTER SESSION SET TXN_PRIORITY = 'HIGH';

Session altered.

SQL> set timing on;
SQL>
SQL> UPDATE employees SET salary = salary * 1.2 WHERE department_id = 10;


2 rows updated.

Elapsed: 00:00:29.99
SQL> SQL> commit;

Commit complete.

Elapsed: 00:00:00.01
SQL>

A Sessão 2 fica bloqueada aguardando a Sessão 1.
Após 30 segundos (conforme PRIORITY_TXNS_HIGH_WAIT_TARGET), o Oracle identifica que a Sessão 1 está segurando um lock indevido e:
  • Executa rollback automático da transação de prioridade baixa (sessão 1) - Apresentando o erro ORA-63302, ORA-63300;
  • Libera imediatamente o lock;
  • Permite que a Sessão 2 prossiga normalmente;
É importante destacar que, na sessão 1, enquanto não for executado um rollback, ficará apresentando o erro ORA-63302: Transaction must roll back, conforme exemplo abaixo.

SQL> set timing on
SQL> UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10;

2 rows updated.

Elapsed: 00:00:00.55
SQL> select 1 from dual;
select 1 from dual
              *
ERROR at line 1:
ORA-63302: Transaction must roll back
ORA-63300: Transaction is automatically rolled back since it is blocking a
higher priority transaction from another session.
Help: https://docs.oracle.com/error-help/db/ora-63302/


Elapsed: 00:00:00.03
SQL> select sysdate;
select sysdate
             *
ERROR at line 1:
ORA-63302: Transaction must roll back
Help: https://docs.oracle.com/error-help/db/ora-63302/


Elapsed: 00:00:00.01

SQL> select sysdate;
select sysdate
*
ERROR at line 1:
ORA-63302: Transaction must roll back
Help: https://docs.oracle.com/error-help/db/ora-63302/


Elapsed: 00:00:00.01
SQL> rollback;

Rollback complete.

Elapsed: 00:00:00.01
SQL> select sysdate;

SYSDATE
--------
28/10/25

Elapsed: 00:00:00.01
SQL>

Fontes:

Comentários