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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
oracle数据库去除重复数据
May 20 #Oracle
解决Oracle数据库用户密码过期
May 11 #Oracle
Oracle中DBLink的详细介绍
instantclient客户端 连接oracle数据库
清空 Oracle 安装记录并重新安装
SQL试题 使用窗口函数选出连续3天登录的用户
Oracle用户管理及赋权
Apr 24 #Oracle
You might like
PHP 压缩文件夹的类代码
2009/11/05 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
php面向对象重点知识分享
2019/09/27 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
python中logging包的使用总结
2018/02/28 Python
python之yield和Generator深入解析
2019/09/18 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
化工操作工岗位职责
2014/04/29 职场文书
林肯就职演讲稿
2014/05/19 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
学生检讨书范文
2015/01/27 职场文书
销售助理岗位职责
2015/02/11 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
2015中学学校工作总结
2015/07/20 职场文书
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js