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指啥?
DDLcreate 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卡住了,没有提交。之后再执行修改就改不了了的主要内容,如果未能解决你的问题,请参考以下文章