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 区块链表创建过程详解
May 15 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
分析SQL窗口函数之排名窗口函数
Apr 21 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
看了就知道什么是JSON
2007/12/09 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
浅析js封装和作用域
2013/07/09 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
使用JavaScript破解web
2018/09/28 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python关于反射的实例代码分享
2020/02/20 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Python更换pip源方法过程解析
2020/05/19 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
高考标语大全
2014/06/05 职场文书
会计求职自荐信
2014/06/20 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
技术入股合作协议书
2014/10/07 职场文书
公司出纳岗位职责
2015/03/31 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
MySQL 开窗函数
2022/02/15 MySQL
Android Studio 计算器开发
2022/05/20 Java/Android