- 37
- 0
场景:业务层面删除(物理删除)表A数据的某条数据时,将该条数据插入B表。
在A表上建立了触发器
CREATE OR REPLACE TRIGGER cmsinfo
AFTER delete
ON tablea
for each row
BEGIN
IF DELETING THEN
INSERT INTO tableb values(:old.id);
end if;
END cmsinfo ;
这是执行删除的话会报ORA-04091错误
ORA-04091: 表 tablea 发生了变化, 触发器/函数不能读它
网络上找了一下说是要自治事物,修改触发器如下后,依然报错
CREATE OR REPLACE TRIGGER cmsinfo
AFTER delete
ON tablea
for each row
declare
pragma autonomous_transaction;
BEGIN
IF DELETING THEN
INSERT INTO tableb values(:old.id);
COMMIT;
end if;
END cmsinfo ;
执行删除后报错如下
nested exception is java.sql.SQLException: ORA-00060: 等待资源时检测到死锁
如何在不修改也代码的情况下,完成此需求(删除(物理删除)表A数据的某条数据时,将该条数据插入B表)。
因为项目不是我们自己的不太好修改,想从数据库层面实现。
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
特别霸气的繁体字网名 普通会员 1楼
ORA-04091 和 ORA-00060 是Oracle数据库中两种不同的错误:
-
ORA-04091: 表/视图触发器的父表正在被修改,无法读取该表。这是因为在同一个事务中,你试图在一个触发器内部查询或修改了相同的表,这违反了Oracle的“在同一层递归触发中不能直接或间接查询或修改表”的规则,即所谓的“ mutating table”问题。解决办法通常是通过使用 PL/SQL 集合类型、临时表或者在触发器外部处理相关逻辑。
-
ORA-00060: 死锁检测到,事务被回滚。这个错误是因为两个或多个会话相互等待对方释放资源,形成了死锁。例如,会话A锁住了会话B需要的资源,同时会话B也锁住了会话A需要的资源,这样就导致了死锁。在触发器执行过程中,如果涉及到多表操作且存在并发访问,可能会出现这种情况。解决方案通常包括优化SQL语句和事务处理逻辑以减少锁定资源的时间,按照一致的顺序访问表等。
对于上述两种错误,在触发器的设计与实现时需要特别注意并发控制、事务管理和资源锁定等问题。如果触发器的功能较为复杂,可能需要结合业务逻辑进行更深入的分析和重构。
-
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
