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 相关文章推荐
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
Oracle设置DB、监听和EM开机启动的方法
Apr 25 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
Oracle删除归档日志及添加定时任务
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
第一节--面向对象编程
2006/11/16 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
php导入导出excel实例
2013/10/25 PHP
php自定义session示例分享
2014/04/22 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python中实现从目录中过滤出指定文件类型的文件
2015/02/02 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
python实现按关键字筛选日志文件
2019/12/24 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
寒假实习自荐信
2014/01/26 职场文书
高校十八大报告感想
2014/01/27 职场文书
班班通校本培训方案
2014/03/12 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
2015年营业员工作总结
2015/04/23 职场文书
2015年话务员工作总结
2015/04/29 职场文书
婚宴父母致辞
2015/07/27 职场文书
详解Python为什么不用设计模式
2021/06/24 Python
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技