Lock(二)解决Lock问题
本文介绍通过Toad、EM及SQL语句来处理数据库产生的锁。在这之前需要对v$lock和v$session这两个数据字典有一定的了解。
(一)使用Toad处理锁
(1)使用Toad的session browser查看锁情况
这里对每一个字段进行解释:
栏位名称 | 说明 |
SID | session ID,每一个session都会产生一个sid,用于标识会话 |
User | 产生锁的数据库用户 |
Lock Type |
锁的类型,常见的有: --DML锁 --Transaction锁(事物锁)等 |
Mode Held | session保持锁的模式: --none --null(NULL) --row-S(SS,行级共享锁。其它session只能查询这些数据行。SQL操作有select for update、lock for update、lock row share) --row-X(SX,行级排它锁。在提交前不允许做DML操作。SQL操作有insert、update、delete、lock row share) --share(S,共享锁。SQL操作有create index,lock share) --S/Row-X(SSX,共享行级排它锁。SQL操作有lock share row exclusive) |
Owner | 被锁定的对象的属主 |
Object Type | 被锁定的对象类型 |
Object Name | 被锁定的对象名称 |
Blocking | 该session是否正在阻塞其他session对资源进行访问。YES代表阻塞 |
Session Blocked | 该会话是否正处于被阻塞的状态,打勾代表该session正在被其他session阻塞 |
OS User | 建立该session的用户的OS名称 |
Machine Name | 建立该session的用户的Machine名称 |
(2)使用Toad解锁
(二)使用SQL命令处理锁
(1)查看锁信息
select
se.machine,
se.sid,
se.serial#,
se.seconds_in_wait,
se.paddr,
lo.block
from
v$lock lo,
v$session se
where
lo.sid = se.sid
and
lo.block > 0; --bloc>0代表这个会话阻塞了其他会话
(2)查看哪个数据库对象被锁
select
lo.sid,
do.owner,
do.object_name
from
v$lock lo,
dba_objects do
where
lo.id1 = do.object_id
and
lo.sid = 23; --这里23是例子,我们需要根据上一步得到的sid来查看具体对象
(3)Kill Session
alter system kill session 'sid,serial#'; --sid,serial从第1步中得到
(4)如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select
pr.spid, --我们要的
se.osuser,
se.program
from
v$session se,
v$process pr
where
se.paddr=pr.addr
and
se.sid=24 --sid从第1步得到
(5)在OS级别Kill Process
(5.1) 在unix上,用root身份执行命令:
su - root
#kill -9 spid --即第步查询出的spid
(5.2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名 ,与上面的session id不同
thread:是要杀掉的线程号,即第4步查询出的spid
例:c:>orakill orcl 12345
(三)模拟锁的产生及处理
(1)对scott.emp表进行行更新,但是不提交
SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
… … … 14 rows selected SQL> update scott.emp set job = 'SALESMAN' where empno = 7369; 1 row updated
(2)使用Toad查看锁情况,已经可以看到锁的存在
(3)查看EM,从EM的top activity并不能看到锁的情况
(4)查看V$lock。V$lock记录了当前数据库中存在的全部锁,锁是Oracle的一种正常的机制,但从这个视图并不能看出什么。对于用户而言,最关心的是TM和TX锁,结合上面Toad的结果,我们可以看到session id = 46的会话已经持续了454s。
SQL> select * from v$lock; ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
... ...
000000008D45B1C0 000000008D45B218 53 AE 100 0 4 0 436 0
00007F2A9960F420 00007F2A9960F480 46 TM 73201 0 3 0 454 0
000000008C105C90 000000008C105D08 46 TX 458781 1379 6 0 454 0
对于TM锁(表级锁),ID1代表的是被锁定的object_id,ID2为0,通过dba_object可以查看到正在被锁的对象的名称。
SQL> select owner,object_name,object_id,object_type from dba_objects where object_id = 73201; OWNER OBJECT_NAME OBJECT_ID OBJECT_TYPE
------ ------------ ---------- ------------
SCOTT EMP 73201 TABLE
(5)再来查看v$session视图,SECOND_IN_WAIT字段代表会话处于等待的时间。
SQL> select se.SADDR,se.SID,se.SERIAL#,se.PADDR,se.USERNAME,se.MACHINE,se.SECONDS_IN_WAIT from v$session se; SADDR SID SERIAL# PADDR USERNAME MACHINE SECONDS_IN_WAIT
---------------- ---------- ---------- ---------------- ------------------------------ --------------------------- ---------------
000000008DF74F68 46 13 000000008DC9F4D0 LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E 1585
000000008DF720F8 47 235 000000008DCA0510 DBSNMP localhost.localdomain 11
... ... ...
(6)在同一个session中执行delete操作,在新开的session中执行update操作。通过Toad,我们可以看到,在sid=46的session上,存在2个DML锁,值得一提的是,在我们对表emp进行操作时,由于其外键在dept表上,也将dept表锁住了。三个DML锁都是SX锁,即行级排它锁,46上还有一个x锁,即排它锁。
SQL> delete from scott.emp where emp.empno = 7369;
SQL> update scott.emp set emp.sal = sal + 200 where emp.empno = 7369 ;
结果如图:
由于执行了delete操作,将dept表也锁了起来
(7)此时,再去观察EM,可看到大量的Application阻塞。并且可以看到这个阻塞是有sid=54的session引起的
通过SQL ID查看具体执行的SQL语句
(8)此时查看v$lock。从红色部分可以看到, session46与session54对object id = 73201的对象产生了表级锁竞争,并且目前session46正在占用该表,导致该session阻塞了session54。
SQL> select * from v$lock; ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
00007F2A9960C378 00007F2A9960C3D8 54 TM 73201 0 3 0 1510 0
00007F2A9960C378 00007F2A9960C3D8 46 TM 73201 0 3 0 3707 0
00007F2A9960C378 00007F2A9960C3D8 46 TM 73199 0 3 0 1798 0
000000008C105C90 000000008C105D08 46 TX 458781 1379 6 0 3707 1
(9)Kill Session
SQL> alter system kill session '46,13'; System altered
至此锁解除。
Lock(二)解决Lock问题的更多相关文章
- 显式锁(二)Lock接口与显示锁介绍
一.显式锁简介 显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...
- --解决Lock wait timeout exceeded; try restarting transaction
--解决Lock wait timeout exceeded; try restarting transaction select * from information_schema.innodb_t ...
- Could not open lock file/var/lib/dpkg/lock的解决
Could not open lock file/var/lib/dpkg/lock的解决 在ubuntu系统中利用apt-get install something的时候,有时候会出现无法获得锁的权 ...
- centos 下yum lock的解决办法
centos 下yum lock的解决办法 centos7下yum install的时候,报了一堆错误,如下: Another app is currently holding the yum loc ...
- 并发编程从零开始(十二)-Lock与Condition
并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 "可重入锁"是指当一个线程调用 object.l ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) 1 BLOG文档结 ...
- Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in another process or thread is using this directory.
1. 问题现象 启动 kafka 时报错:Failed to acquire lock on file .lock in /tmp/kafka-logs. A Kafka instance in an ...
- Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock
Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...
- ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
通过service mysql status 命令来查看mysql 的启动状态 报错如下: ERROR! MySQL is not running, but lock file (/var/lock/ ...
随机推荐
- 【G】开源的分布式部署解决方案文档 - 部署Console & 控制负载均衡 & 跳转持续集成控制台
G.系列导航 [G]开源的分布式部署解决方案 - 导航 设置项目部署流程 项目类型:选择Console,这个跟功能无关,只是做项目分类,后面会有后续功能 宿主:选择Console 部署方式:选择原始, ...
- MapReduce处理流程
MapReduce是Hadoop2.x的一个计算框架,利用分治的思想,将一个计算量很大的作业分给很多个任务,每个任务完成其中的一小部分,然后再将结果合并到一起.将任务分开处理的过程为map阶段,将每个 ...
- Java Script 字符串操作
JS中常用几种字符串操作: big() small() bold() fontcolor() fontsize() italics() strike() link() charAt() charCod ...
- superslide2插件
地址:http://www.superslide2.com/ 做自适应要注意该宽度和高度 等比缩放
- 解析View的getDrawingCache方法
1. View 的getDrawingCache方法 有时候需要将某个view的内容以图片的方式保存下来,感觉就和截图差不多,可以使用View 的getDrawingCache方法,返回一个Bitma ...
- .net 做工作流时,生成项目后工具箱里有关工作流的东西不显示解决方法
在做工作流模块时,遇到一个比较棘手的问题,那就是生成项目后工具箱里有关工作流的东西不显示,这个问题令人百思不得其解,经过查阅英文网站,终于找到解决方法: 把项目中的建模项目移除掉,再重新生成,奇迹出现 ...
- OD常用断点之CC断点
在做Windows平台软件逆向时,Ollydbg是极其常用的逆向工具,动态调试功能非常强大.在调试过程中,断点的使用有助于确定关键的破解位置,今天讲解的内容是OD常用断点中的CC断点. CC断点有很多 ...
- 解决css引用图片不显示问题:background-image: url(../image/document.png);
.icon-document { background-image: url(../image/document.png); display:block; float: left; width: 25 ...
- 转:Centos6.5_x86安装Redis。
Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...
- .net Ajax与后台一般处理程序(ashx) 交互
本文主要实现无动态刷新查询后台数据功能,主要用到ajax+ashx+sqlserver进行交互. 首先需要引用Jquery: <script language="javascript& ...