问题描述
有时候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进程并不能彻底清除锁的问题。

最新文章

  1. java4
  2. js对象的继承以及公有私有属性的定义和读写
  3. mysql学习(3)-linux下mysql主从复制
  4. docker管理shipyard中文版v3.0.2更新
  5. php处理数组函数大全
  6. Formatting Domain Names--域名可以由哪些字符串组成
  7. php如何查找会员无限分类的所有上级和所有下级
  8. 手机扫描二维码下载APP,根据操作系统不同自动下载
  9. java学习:AWT组件和事件处理的笔记(1)--文本框上的ActionEvent事件
  10. 绿色mysql启动脚本
  11. ARM 7 用户模式下禁止/使能中断的一种方法--使用软中断 for Keil MDK
  12. XSLT 调用外部程序
  13. ###服务(Service)
  14. 关于 tomcat 配置时遇到的问题与警告及解决办法
  15. 2018OKR年中回顾
  16. 清除冗余的css
  17. python多线程应用——DB2数据库备份
  18. JS常用各种正则表达式(汇总)
  19. typescript handbook 学习笔记2
  20. JavaScipt测试调研

热门文章

  1. Visual Studio 跨平台開發實戰(2) - Xamarin.iOS 基本控制項介紹 (转帖)
  2. win8.1中向IIS注册asp.net
  3. (转)Heartbeat+DRBD+MySQL高可用方案
  4. java动态加载机制
  5. Cassandra概念学习系列之Cassandra是什么?
  6. js 页面间的通信
  7. gulp教程之gulp中文API
  8. 以安全模式启动firefox
  9. Scrum 冲刺博客第三篇
  10. IOS使用Auto Layout中的VFL适配