当前位置: 首页 > java >正文

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错误
  • - 等待时间非严格上限(多层阻塞时逐级超时)

 

http://www.xdnf.cn/news/13393.html

相关文章:

  • [源码分享]电视盒子应用商店,机顶盒应用商店,TV应用商店,应用市场,前后端源码全开源
  • LCA最近公共祖先问题详解
  • 如何将SeaTunnel MySQL-CDC与Databend 高效整合?格式与方案全解析
  • 广告推荐系统中模型训练中模型的结构信息、Dense数据、Sparse数据
  • GPT-ArcGIS 在生态评价中的综合应用:多因子权重分析与适宜性制图
  • 深度学习小项目合集之音频语音识别-视频介绍下自取
  • CVPR2025 | 遥感深度学习方向论文列表合集!
  • 疏锦行Python打卡 DAY 26 函数专题1:函数定义与参数
  • Linux下基础IO
  • HTML原生日期插件增加周次显示
  • 中钧科技三大平台破局企业数字化转型:告别“人肉运维”,拥抱“数据自驱”!
  • 将vmware下旧的黑群晖nas迁移到别的服务器,并对硬盘进行扩容
  • 【Bluedroid】蓝牙启动之 RFCOMM_Init 流程源码解析
  • 每日算法 -【Swift 算法】实现有效括号匹配算法
  • Android studio中git突然看不了提交记录
  • STM32外设学习之ADC
  • C++显性契约与隐性规则:类型转换
  • ES6从入门到精通:变量
  • 前端基础知识ES6系列 - 01(var、let、const之间的区别)
  • 深入理解 Go 中的字节序(Endianness)检测代码
  • 数据结构(9)排序
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的新零售融合路径研究
  • uni-app离线打包配置Android打包(使用Android studio打包)
  • 【Python打卡Day33】简单神经网络@浙大疏锦行
  • AWS TAM行为面试模拟题
  • MFE微前端基础版:Angular + Module Federation + webpack + 路由(Route way)完整示例
  • 一键实现全站多语言化:translate.js 极简集成指南,支持Vue 、React 框架。
  • C++ 网络编程(11)服务器逻辑层设计和消息完善
  • 老飞飞bug及原理修复方法
  • 基于 SpaCy 框架的依存句法分析实战指南