26-Oracle 23 ai Automatic Transaction Rollback(行锁终结者)
一、时不时就冒出来的锁,各种kill
小伙伴们,有没有经常遇见各种事务锁,需要KILL,业务、开发各种发来的信息,kill一个session,有时候还会因为一个带崩另一个。
在ACID的事务中,为了数据安全。当会话持有行锁未提交(如未提交的UPDATE),会阻塞其他会话的DML操作。DBA的小伙伴就需要人肉手动介入终止会话(KILL SESSION),导致业务中断且效率低下。
Oracle 23 ai 带来了自动事务回滚(Automatic Transaction Rollback) 通过事务优先级机制,自动终止低优先级阻塞事务,实现按照预先制定的规则进行优先级自治,解放DBA的小能手。
二、技术实现
1. 事务定义优先级机制
- 三个优先级:HIGH(默认)、MEDIUM、LOW
- 判定规则:高优先级事务被低优先级阻塞时,若超时未获锁,自动回滚低优先级事务(会话保持存活)
--核心参数:
ALTER SESSION SET TXN_PRIORITY = LOW; -- 设置会话事务优先级
ALTER SYSTEM SET PRIORITY_TXNS_HIGH_WAIT_TARGET=10; -- 高优先级等待阈值(秒)
ALTER SYSTEM SET PRIORITY_TXNS_MEDIUM_WAIT_TARGET=20; -- 中优先级等待阈值(秒)
2. 自动回滚流程
- 触发条件:高优事务等待时间 > PRIORITY_TXNS_HIGH_WAIT_TARGET
- 执行动作:
自动回滚低优先级阻塞事务
阻塞会话抛出错误(需要应用层设置捕获):
-
- ORA-63300: 事务被自动回滚
- ORA-63302: 必须执行ROLLBACK后才允许新操作
- 会话状态:会话不会终止!需显式执行ROLLBACK后继续工作。
3. 多层阻塞处理
- 若存在多个低优事务阻塞链,按等待顺序逐级回滚
- 比如:T1(LOW) → 阻塞 → T2(LOW) → 阻塞 → T3(HIGH)T3等待10秒 → 回滚T1 → T2获得锁 → T3再等10秒 → 回滚T2 → T3成功
三、使用场景
场景 | 配置方案 |
关键业务操作 | 会话设置TXN_PRIORITY=HIGH+ 系统级调低PRIORITY_TXNS_HIGH_WAIT_TARGET |
批处理任务 | 会话设置TXN_PRIORITY=LOW避免影响在线业务 |
应用超时控制 | 结合PRIORITY_TXNS_HIGH_WAIT_TARGET替代应用层超时机制 |
灰度测试 | 设置TXN_AUTO_ROLLBACK_MODE=TRACK(仅监控不实际回滚) |
四、23 ai 实操脚本
-- STEP1:系统参数配置 (需SYSDBA)
ALTER SYSTEM SET PRIORITY_TXNS_HIGH_WAIT_TARGET=10 SCOPE=BOTH;
ALTER PLUGGABLE DATABASE FREEPDB1 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE FREEPDB1 OPEN;
--
DOCUSER@localhost:1521/FREEPDB1> select name2 from V$SYSSTAT3* where name like '%txns rollback%';NAME
_________________________________________________
txns rollback priority_txns_high_wait_target
txns rollback priority_txns_medium_wait_target--
-- STEP2:创建测试表
CREATE TABLE lock_test1 (id NUMBER PRIMARY KEY, val VARCHAR2(20));
INSERT INTO lock_test1 VALUES (1, 'Init');-- STEP3:会话1(低优事务阻塞)
ALTER SESSION SET TXN_PRIORITY=LOW;
UPDATE lock_test1 SET val='Blocking' WHERE id=1; -- 不提交!-- STEP4:会话2(高优事务被阻塞)
ALTER SESSION SET TXN_PRIORITY=HIGH;
UPDATE lock_test1 SET val='HighPriority' WHERE id=1; -- 进入等待-- STEP5:监控等待链(新会话,重新开个终端)
SELECT sid, event "等待事件",blocking_session "阻塞会话",txn_priority "事务优先级",seconds_in_wait "已等待(秒)"
FROM v$session
WHERE event LIKE '%enq: TX%';-- 等待10秒后观察:会话1自动回滚,会话2更新成功
-- 会话1后续操作:
SELECT * FROM lock_test1; -- 抛出ORA-63300
ROLLBACK;
-- 需要执行以清除错误状态
五、监控与错误处理
5.1 关键动态视图:
-- 事务视图中可以查看事务优先级及等待目标
SELECT txn_priority, priority_txns_wait_target
FROM v$transaction;
--
DOCUSER@localhost:1521/FREEPDB1> SELECT txn_priority, priority_txns_wait_target2* FROM v$transaction;TXN_PRIORITY PRIORITY_TXNS_WAIT_TARGET
_______________ ____________________________
HIGH 0--
-- 实时锁阻塞分析
SELECT sid, event "Event",seconds_in_wait "Wait Secs",blocking_session "Blocker"
FROM v$session
WHERE event LIKE '%enq: TX%';
--
DOCUSER@localhost:1521/FREEPDB1> SELECT2 sid,3 event "Event",4 seconds_in_wait "Wait Secs",5 blocking_session "Blocker"6 FROM v$session7* WHERE event LIKE '%enq: TX%';no rows selected
--
5.2 应用层捕获信息,容错设计:
--Java应用层捕获,开发的小伙伴,.net的就不提供了
try {stmt.executeUpdate("UPDATE...X...X");
} catch (SQLException e) {if(e.getErrorCode() == 63300 || e.getErrorCode() == 63302) {conn.rollback(); // 关键:显式回滚后重试retryOperation(); }
}
六、回顾-小改变大受益,Oracle真要进入自治时代了
- 1.业务无损:仅回滚事务不终止会话,连接池无需重建
- 2.精准控制:优先级+超时阈值实现手术式阻塞解除
- 3.运维革命:告别ALTER SYSTEM KILL SESSION的手动人手粗暴的操作
- 4.高可用增强:有效应对应用逻辑缺陷导致的锁扩散
TIPS:
- - 默认优先级为HIGH,需主动配置低优事务才会触发自动回滚
- - 应用必须处理ORA-63300和ORA-63302错误
- - 等待时间非严格上限(多层阻塞时逐级超时)