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;
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
Postar um comentário