锁表处理 SQL 错误: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效..._weixin_34199335的博客-程序员宝宝

技术标签: java  数据库  

问题描述
有时候ORACLE数据的某些表由于频繁操作,而且比较大,会导致锁表(死锁)。

问题分析
(1)锁的分析
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive 数字越大锁级别越高, 影响的操作越多。
1级锁有: S e l e c t , 有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。
3级锁有:Insert,Update,Delete,Lock Row Exclusive 没有commit之前插入同样的一条记录会没有反应, 因为后一个3级的锁会一直等待上一个3级的锁,我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Share locked_mode为2、3、4级锁,不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。00054, 00000, "resource busy and acquire with NOWAIT specified" // *Cause: Resource interested is busy. //*Action: Retry if necessary.
5级锁有:Lock Share Row Exclusive 具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
6级锁有:Alter table, Drop table, Drop Index,Truncate table, Lock Exclusive

(2)查询锁方法
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:

SELECT T2.USERNAME,T2.SID,T2.SERIAL#,T2.LOGON_TIME FROM
V$LOCKED_OBJECT T1,V$SESSION T2 WHERE T1.SESSION_ID=T2.SID
ORDER BY T2.LOGON_TIME

如果有长期出现的一列,可能是没有释放的锁。

--- 查锁表

SELECT SESS.SID, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME,
AO.OBJECT_NAME,MACHINE, LO.LOCKED_MODE,'ALTER SYSTEM KILL SESSION '''||SESS.sid||','||SESS.serial#||''';' AS SQLSTR
FROM V$LOCKED_OBJECT LO, DBA_OBJECTS AO, V$SESSION SESS
WHERE AO.OBJECT_ID = LO.OBJECT_ID 
AND LO.SESSION_ID = SESS.SID;

将上面SQL中的 SQLSTR 语句复制出来执行一下

解决方法:

(1)释放锁的方法:
我们可以用下面SQL语句杀掉长期没有释放非正常的锁:

ALTER SYSTEM KILL SESSION 'SID,SERIAL#'; //SID,SERIAL#是上面查询出来的

(2)系统级杀进程方法释放锁:

SELECT SPID FROM V$PROCESS WHERE ADDR = (SELECT PADDR FROM V$SESSION WHERE SID=&SID);$ KILL -9 SPID //SPID是上面查询出来的

(3)注意点:如果出现了锁的问题, 某个DML操作可能等待很久没有反应。 当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁,杀OS进程并不能彻底清除锁的问题。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34199335/article/details/86039273

智能推荐

UITabBarController跳转任意界面的方法_weixin_34010949的博客-程序员宝宝

为什么80%的码农都做不了架构师?>>> ...

【虚拟仿真】Unity3D中拆分模型教程(多种类型模型拆分)_恬静的小魔龙的博客-程序员宝宝_unity拆分模型

推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。一、前言今天有小伙伴在我这篇文章【虚拟仿真】Unity3D对物体进行拆分实现下面问我如何一秒一拆:虽然我已经给出了思路,但是离实现还是有点思路,正好我对于我这篇文章也是不满意,就解答一下小伙伴的疑惑,然后再将文章内容进行升级。原文章:【虚拟仿真】Unity3D对物体进行拆分实.

Python常用数据类型详解——元组详解_程序员二黑的博客-程序员宝宝

元组包含的内置函数及使用方法如下:元组:不可修改的序列,包括字符串,创建方法也很简单,用逗号隔开或小括号即可创建一个元组。(1)常规元组:(2)tuple函数是将一个序列作为参数,并将其转换成元组,如果参数已经是元组,就原封不动地返回元组。(3)元组中元素的访问:(4)元组的必要性:他们用作映射中的键(以及集合的成员),而列表不行;有些内置函数和方法返回元组,这以为这必须跟元组打交道,只要不尝试修改即可。每天持续更新,软件测试知识!如果你不想再体验一

linux 配置php自启_我爱吃煎饼~的博客-程序员宝宝

vim /etc/init.d/php-fpm//下面复制即可   不要以为有# 就不需要#!/bin/sh# chkconfig:   2345 15 95# description:  PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation \# with some additional fe...

java不区分大小写查找字符串_一只偷吃香蕉的猪的博客-程序员宝宝_java搜索不区分大小写

在字符串查找上,很重要一个是不区分大小写的查找,而java的api中没有直接提供这个方法。public class StringUtil { public static void main(String[] args) { String t="aaaaaaaaaa<table></table>aaa&...

随便推点

前端笔试题笔记:在HTML中实现table表头点击升序/降序排序_ldldong的博客-程序员宝宝

题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序。

JAVA Web获取路径几种方式_zcjlq1的博客-程序员宝宝

“` String savedDir1 = request.getSession().getServletContext().getRealPath(“”); // D:\Users\Administrator\IdeaProjects\Angular\hrmapp\target\hrmapp URL url = Thread.currentThr

@PostConstruct使用之静态方法注入bean_zzy_阳阳的博客-程序员宝宝

       @PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。        @Componentpublic class HttpUtilsV2 { private static final Logger LOGGER = LoggerFactory.getLogger(Htt...

c#抓取网页内容,基本解决乱码问题;适配各类网页_babyjoycry的博客-程序员宝宝

private string GetHtmlCode(string url) { string htmlCode; HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); web...

linux串口烧写dsp,一种通过串口进行DSP程序烧制的方法与流程_明儿去打球的博客-程序员宝宝

本发明属于信息技术领域:,尤其涉及一种通过串口进行DSP用户程序烧写的方法。背景技术::TMS320F2812DSP是一款高性能微控制器,被大量用于机载和弹上设备,能够实现复杂的控制算法。但是由于外场场地、空间等限制,DSP系统一般安装在复杂、封闭的环境,程序升级非常不便。目前较多采用的为以下两种方式:一是利用CCS集成的Flash烧写插件进行程序烧写。该方法简单易行,可直接烧写编译后生成的.ou...

es6 javascript 的Generator 函数 (上)_暮志未晚Webgl的博客-程序员宝宝

1 简介1.1 基本概念Generator 函数是 ES6 提供的一种异步编程解决方案, 语法行为与传统函数完全不同。 本章详细介绍 Generator 函数的语法和 API, 它的异步编程应用请看《 异步操作》 一章。Generator 函数有多种理解角度。 从语法上, 首先可以把它理解成, Generator 函数是一个状态机, 封装了多个内部状态。执行 Generator 函数会返回一个遍历...

推荐文章

热门文章

相关标签