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数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
快速学习Oracle触发器和游标
Jun 30 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
Oracle使用别名的好处
Apr 19 Oracle
Oracle中DBLink的详细介绍
Apr 29 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 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
PHP 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
实例讲解JavaScript中instanceof运算符的用法
2016/06/08 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
JS中的作用域链
2017/03/01 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
Seajs源码详解分析
2019/04/02 Javascript
vue前端框架—Mint UI详解(更适用于移动端)
2019/04/30 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
python模拟Django框架实例
2016/05/17 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
破解安装Pycharm的方法
2018/10/19 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
python 经典数字滤波实例
2019/12/16 Python
Python3.9新特性详解
2020/10/10 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
生日邀请函范文
2014/01/13 职场文书
聘用意向书范本
2014/04/01 职场文书
家长对老师的评语
2014/04/18 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
共青团员自我评价范文
2014/09/14 职场文书
查摆剖析材料范文
2014/09/30 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
通知函格式范文
2015/04/27 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书