oracle执行了一条for update卡住了,没有提交。之后再执行修改就改不了了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle执行了一条for update卡住了,没有提交。之后再执行修改就改不了了相关的知识,希望对你有一定的参考价值。

oracle执行了一条for update卡住了,没有提交。之后再执行修改就改不了了,求大神指点

我根据我遇到的相同问题整理的解决方法
问题场景:
在更新或插入等DML操作中,因网络中断或忘记提交,导致相同记录再次执行时感知为长时间无法执行成功。
解决方法:
一、code处理
1.再次执行相同记录的语句;
2.查询被阻塞的会话
SELECT l.session_id,o.owner,o.object_name, machine, s.sid, s.serial#,s.blocking_session
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.blocking_session is not null;
3.根据被阻塞会话查找原会话信息
SELECT l.session_id, o.owner, o.object_name, machine, s.sid, s.serial#,s.sid||','||s.serial# kill_session
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
AND s.sid = 759;
SELECT s.sid, s.serial#,s.sid||','||s.serial# kill_session FROM v$session s WHERE sid = 759;
4.杀死原会话
alter system kill session '759,18523';
二、PLSQL处理
原理与code处理一样,先找到现有会话,然后反推阻塞会话,最后将其杀死
1.查询被阻塞的会话,找到Blocking session
2.根据Blocking session查找原会话信息,直接点击kill杀会话
参考技术A for update的时候有人锁表了吧,可以先杀死锁表的进程,再次执行。

oracle中DDL DML指啥?

DDL
create table 创建表
alter table 修改表
drop table 删除表
truncate table 删除表中所有行
create index 创建索引
drop index 删除索引
当执行DDL语句时,在每一条语句前后,oracle都将提交当前的事务。如果用户使用insert命令将记录插入到数据库后,执行了一条DDL语句(如create table),此时来自insert命令的数据将被提交到数据库。当DDL语句执行完成时,DDL语句会被自动提交,不能回滚。

DML
insert 将记录插入到数据库
update 修改数据库的记录
delete 删除数据库的记录
当执行DML命令如果没有提交,将不会被其他会话看到。除非在DML命令之后执行了DDL命令或DCL命令,或用户退出会话,或终止实例,此时系统会自动发出commit命令,使未提交的DML命令提交。
参考技术A DDL 数据定义语言的英文缩写 create drop alter等语句
DML 数据操作语言的英文缩写 insert update delete 等语句
参考技术B 下定义的,或者改变定义的就是DDL
查找、修改、新增、删除数据的就是DML

以上是关于oracle执行了一条for update卡住了,没有提交。之后再执行修改就改不了了的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句update中的where条件的用法问题

ORACLE常见问题收集

oracle中for update语句执行时间过长的问题

select for update

关于oracle存储过程select into 未找到数据问题

oracle中DDL DML指啥?