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
ORACLE数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
ORACLE查看当前账号的相关信息
Jun 18 Oracle
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
Jun 21 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Nov 20 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
oracle数据库去除重复数据
May 20 #Oracle
解决Oracle数据库用户密码过期
May 11 #Oracle
Oracle中DBLink的详细介绍
instantclient客户端 连接oracle数据库
清空 Oracle 安装记录并重新安装
SQL试题 使用窗口函数选出连续3天登录的用户
Oracle用户管理及赋权
Apr 24 #Oracle
You might like
php 多个submit提交表单 处理方法
2009/07/07 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
php常用数组函数实例小结
2016/12/29 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
javascript的函数
2007/01/31 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
施工班组长岗位职责
2014/01/05 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
产品质量承诺书
2014/03/27 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
小鞋子观后感
2015/06/05 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL