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

oracle 触发器与commit的先后执行顺序

oracle11g

前些天朋友问了一个触发器的问题,引发了我进一步实验验证的想法:触发器与commit的先后顺序,以及触发器中的before、after是以哪个时间点划分的,rollback对触发器的影响。

相关代码

create table test (id number, name varchar2(64));

insert into test (id,name) values (1,'c');

commit;

create table res (res varchar2(64));

create or replace trigger test_tri_1 -- 命名

after insert -- 触发时机及触发事件

on test -- 在test触发

for each row -- 行级触发器

declare

str varchar2(100); -- 声明变量

pragma autonomous_transaction;

begin

  select name into str from test where id=:new.id; -- 从test2表获取c2字段值

  dbms_output.put_line(str);

  insert into res values (str);

  commit;

end;

insert into test (id,name) values (2,'y');

select * from test 、select * from res、delete from test where id=2

开启多个sql窗口,分别执行触发器的编译调整、insert语句、select等。

触发器与触发语句commit的先后顺序

创建触发器(before),执行insert,如下所示,test里查询不到新数据。

调整触发器(after),执行insert,test里查询不到新数据。

结论1:经验证,不论触发器是before还是after,触发器被触发执行完成时,触发触发器的dml语句都尚未真正提交(commit)入库入表。

触发器中before、after以什么划分

结论2:顺便说一句,网上有些说法是before是commit之前、after是commit之后,经过结论1的实验验证,这个说法不成立。

还有一种说法是before是触发事件前,after是触发事件后,before可以拿到触发发生前的旧数据,after拿不到。其实:new是新数据,:old是旧数据,都可以拿到,也实验验证确实能拿到(使用update触发事件验证),这种说法也不成立。

那么before、after到底是以哪个时间点划分的呢?待验证

触发语句rollback对触发器的影响

结论3:开启独立事务的情况下(即需要在触发器declare和begin之间加入关键词pragma autonomous_transaction),触发器代码中必须带commit(否则执行dml语句触发触发器时报错:ORA-06519: 检测到活动的独立的事务处理, 已经回退),则触发器中相关数据在触发触发器的dml语句commit前,就已经写入到了触发器数据的目标表中,即使dml语句被rollback,对这些数据也不影响。若不开启独立事务,则触发器代码中不能出现commit(否则在执行dml语句触发触发器时报错:ORA-04092: COMMIT 不能在触发器中),触发器代码与触发触发器的dml语句一起构成一个完整的事务,即要么一起commit,要么一起rollback。

http://www.dtcms.com/a/176324.html

相关文章:

  • Linux如何安装AppImage程序
  • Postman中https和http的区别是什么?
  • 2025数字中国创新大赛-数字安全赛道数据安全产业积分争夺赛决赛Writeup
  • fedora系统详解详细版本
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十)
  • 初学Python爬虫
  • 架设手游使用游戏盾SDK怎么提升网络速度?
  • 音频相关基础知识
  • RTC实时时钟DS1337S/PT7C4337WEX国产替代FRTC1337S
  • webRtc之指定摄像头设备绿屏问题
  • Ubuntu 单机多卡部署脚本: vLLM + DeepSeek 70B
  • 游戏引擎学习第262天:绘制多帧性能分析图
  • MySQL的深度分页如何优化?
  • ESP32开发入门(五):WiFi 开发实践
  • 0509滴滴前端项目常见内容
  • ElementUI 表格el-table自适应高度设置
  • 007 Linux 开发工具(上)—— vim、解放sudo、gc+
  • Golang 接口 vs Rust Trait:一场关于抽象的哲学对话
  • LeetCode383_赎金信
  • Jenkins 服务器上安装 Git
  • Apache Calcite 详细介绍
  • 【EasyPan】loadDataList方法及checkRootFilePid方法解析
  • comfyui 实现中文提示词翻译英文进行图像生成
  • VScode一直处于循环“正在重新激活终端“问题的解决方法
  • 【上位机——MFC】序列化机制
  • 机器学习在信用卡欺诈检测中的应用思考
  • 基于英特尔 RealSense D455 结构光相机实现裂缝尺寸以及深度测量
  • svn服务器迁移
  • 使用VSCode在Windows 11上编译运行项目
  • Mybatis标签使用 -association 绑定对象,collection 绑定集合