本文介绍通过Toad、EM及SQL语句来处理数据库产生的锁。在这之前需要对v$lockv$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)
--exclusive(X,排它锁。SQL操作有alter table、drop table、drop index、truncate table、lock exclusive等DDL操作)

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问题的更多相关文章

  1. 显式锁(二)Lock接口与显示锁介绍

    一.显式锁简介    显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...

  2. --解决Lock wait timeout exceeded; try restarting transaction

    --解决Lock wait timeout exceeded; try restarting transaction select * from information_schema.innodb_t ...

  3. Could not open lock file/var/lib/dpkg/lock的解决

    Could not open lock file/var/lib/dpkg/lock的解决 在ubuntu系统中利用apt-get install something的时候,有时候会出现无法获得锁的权 ...

  4. centos 下yum lock的解决办法

    centos 下yum lock的解决办法 centos7下yum install的时候,报了一堆错误,如下: Another app is currently holding the yum loc ...

  5. 并发编程从零开始(十二)-Lock与Condition

    并发编程从零开始(十二)-Lock与Condition 8 Lock与Condition 8.1 互斥锁 8.1.1 锁的可重入性 "可重入锁"是指当一个线程调用 object.l ...

  6. 【等待事件】序列等待事件总结(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文档结 ...

  7. 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 ...

  8. Synchronized和Lock, 以及自旋锁 Spin Lock, Ticket Spin Lock, MCS Spin Lock, CLH Spin Lock

    Synchronized和Lock synchronized是一个关键字, Lock是一个接口, 对应有多种实现. 使用synchronized进行同步和使用Lock进行同步的区别 使用synchro ...

  9. 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/ ...

随机推荐

  1. Struts2中there is no action mapped for acion name (/XXXXX)

    这里的问题出在配置struts.xml中,去掉配置中 namespace="/"属性 即可解决.不同的调用action的方式对namespace="/"属性有的 ...

  2. 腾讯云上Selenium用法示例

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 前言 在上一节我们学习了PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运 ...

  3. MVC实现SSO

    近来工作无事,想做个SSO, 之前做过一个项目用到SSO,自己也没有看明白是个什么东西.现在正好有时间,所以想研究下. 先是从网上看到了SSO的思路: 三个站点:SiteA,SiteB,SiteMai ...

  4. 兼容IE8的input输入框的正确使用姿势

    input是一个很常见的标签,大家使用的也很常见,但是我在具体的工作中发现要想完美的使用这个标签还是任重而道远,下面是我碰到的几个问题. 1.我们在使用这个标签的时候会习惯的加上placeholder ...

  5. HTTP长连接、短连接使用及测试

    概念 HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接.所以,下一次的HTTP请求/响应操作就需要重新建立连接. HTTP长连接(持久连接)是指,客户端和服务 ...

  6. 【Java SE】如何用Java实现冒泡排序

    摘要: 作为一名Java开发工程师,手头如果不会几个常见的排序算法,怎么可能经过笔试题这一关呢.据我所知,许多大型的公司的笔试题都有排序题,那我们先从最简单的排序:冒泡排序开始,以后几篇博客将继续更新 ...

  7. jdbc ,jdbcTemplate,MyBatis,Hibernate比较与分析

    JDBC 1:jdbc(Java Data Base Connection 数据库连接)是一种用于执行sql语句的API,其中使用jdbc连接时需要的,Connection,Statement,Res ...

  8. 深刻认识shift_ram IP core——图像处理学习笔记

    在进行图像处理算法中,往往需要生成图像像素矩阵,这对于C语言来说可以直接用数据表示,但是对于verilog来说便不是那么容易了,硬件描述语言不比软件,它的核心不再算法,而是在于设计思想,加速硬件.在进 ...

  9. JQuery实现通过点击标题切换字体

    这个主要通过判断被点击的元素的子元素中是否包含了b元素来进行字体的切换,其中wrapInner函数是为了在$author元素的内部添加b标签. 切换回正常字体是通过将内容转化为纯文本形式,再替换元素内 ...

  10. PHP预定义变量$_SERVER

    PHP预定义变量$_SERVER $_SERVER 是一个包含诸如头部(headers).路径(paths)和脚本位置(script locations)的数组.数组的实体由 web 服务器创建,不能 ...