oracle执行update语句阻塞

本文探讨了在Oracle数据库中执行更新语句时遇到的死锁问题,特别是在使用Java程序进行开发时。文章详细解释了如何通过查询锁定记录并解除锁定来解决这一问题,避免在调试过程中因未提交的事务导致的记录锁定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
1.开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果。但是奇怪的是执行其他的select语句却是可以执行的。

2.在plsql中执行以下语句(为了更改值)

select d.*,d.rowid
from DAILY_FAILURE d
where time='2019-11-04'

手动改完后未commit,导致对同一行数据进行变更,会变锁住

原因
1.这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住(行锁)。由于我的java程序中加了事务,之前debug到一半的时候我强制把工程终止了,这样就导致没有执行事务提交,所以oracle将代码中update那一条的记录锁了。

2.执行语句,未进行commit,结束事务

可通过下面两步解决:

1.查询出锁定记录
SELECT CONCAT('ALTER SYSTEM KILL SESSION ''',CONCAT(CONCAT(CONCAT(s.sid,','),s.serial#),''';')) 
FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;

2.然后删除之
拷贝第一步查询出的结果,按个执行,就能删除

 

参考

https://blog.youkuaiyun.com/trigl/article/details/50725683

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值