Oracle锁表解决方法的详细记录


Posted in Oracle onJune 05, 2022

前言

锁表或锁超时相信大家都不陌生,经常发生在DML语句中,产生的原因就是数据库的独占式封锁机制,当执行DML语句时对表或行数据进行锁住,直到事务提交或回滚或者强制结束当前会话。

对于我们的应用系统而言锁表大概率会发生在SQL执行慢并且没有超时的地方(一条SQL由于某种原因(Spoon工具做数据抽取与推送)一直执行不成功并且一直不释放资源)因此写出高效率SQL也尤为重要!还有另外情况也会发生锁表,就是高并发场景,高并发会带来的问题就是Spring事务会造成数据库事务未提交产生死锁(当前事务等待其他事务释放锁资源)!从而抛出异常java.sql.SQLException: Lock wait timeout exceeded;。

那么如何解决锁表或锁超时呢?临时性解决方案就是找出锁资源竞争的表或语句,直接结束当前会话或sesstion,强制释放锁资源。例如

解决方法如下:

1、session1修改某条数据但是不提交事务,session2查询未提交事务的那条记录

Oracle锁表解决方法的详细记录

2、session2尝试修改

Oracle锁表解决方法的详细记录

我们可以看到修改未提交事务的记录会处于一直等待状态,直到对方释放锁资源或强制关闭session1。这里也说明了Oracle做到了行级锁!

这里只是简单的模拟了出现锁表情况,可以一眼看出就是session1导致的锁表。实际开发中遇到这种情况一般都是使用SQL直接查出锁资源竞争的表或语句然后进行资源的强制释放!!

3、session3查询竞争资源的表或语句,强制释放资源

-- 查询未提交事务的session信息,注意执行以下SQL,用户需要有DBA权限才行
SELECT
    L.SESSION_ID,
    S.SERIAL#,
    L.LOCKED_MODE AS 锁模式,
    L.ORACLE_USERNAME AS 所有者,
    L.OS_USER_NAME AS 登录系统用户名,
    S.MACHINE AS 系统名,
    S.TERMINAL AS 终端用户名,
    O.OBJECT_NAME AS 被锁表对象名,
    S.LOGON_TIME AS 登录数据库时间
FROM V$LOCKED_OBJECT L
    INNER JOIN ALL_OBJECTS O ON O.OBJECT_ID = L.OBJECT_ID
    INNER JOIN V$SESSION S ON S.SID = L.SESSION_ID
WHERE 1 = 1

查询结果如下

Oracle锁表解决方法的详细记录

对我们强制释放资源有用的只有前面两个字段,例如

-- 强制 结束/kill 锁表会话语法
ALTER SYSTEM KILL SESSION 'SESSION_ID, SERIAL#';

-- 强制杀死session1,让session2可以修改id=5的那条记录
ALTER SYSTEM KILL SESSION '34, 111';

强制杀死session1后,注意观察session2的执行情况!我们会发现session2的等待会立即终止并执行!相信小伙伴们都有一个疑惑,session_id有29和34,如何确定他们属于session1还是session2,保证杀死的是session1让session2成功执行DML语句?

其实也很简单,这里的判断方式就是session1执行更新但不提交事务,可先用以上SQL查询未提交事务的session信息,此时查到的就是session1的信息。

总结

到此这篇关于Oracle锁表解决的文章就介绍到这了,更多相关Oracle锁表解决内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
使用springboot暴露oracle数据接口的问题
May 07 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
oracle索引总结
Sep 25 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
Oracle使用别名的好处
Apr 19 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 Oracle
oracle数据库去除重复数据
May 20 #Oracle
解决Oracle数据库用户密码过期
May 11 #Oracle
Oracle中DBLink的详细介绍
instantclient客户端 连接oracle数据库
清空 Oracle 安装记录并重新安装
SQL试题 使用窗口函数选出连续3天登录的用户
Oracle用户管理及赋权
Apr 24 #Oracle
You might like
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
JavaScript面象对象设计
2008/04/28 Javascript
最短的IE判断代码
2011/03/13 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
浅谈React Event实现原理
2018/09/20 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
结婚典礼证婚词
2014/01/08 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
清扬洗发水广告词
2014/03/14 职场文书
报关报检委托书
2014/04/08 职场文书
干部鉴定材料
2014/05/18 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书