制造死锁

创造环境

create table t1_deadlock (a int);
create table t2_deadlock (a int);

insert into t1_deadlock values (1);
insert into t2_deadlock values (2);

--第一步
update t1_deadlock set a = 1000 where a = 1;

--第二步
update t2_deadlock set a = 2000 where a = 2;

--第三步
update t2_deadlock set a = 2000 where a = 2;

这里出现了“锁等待”(“阻塞”)的现象,原因很简单,因为在session2中已经对这条数据执行过这个操作,在session2中已经对该行加了行级锁。
注意,这里是“锁等待”,不是“死锁”,注意这两个概念的区别!

--第四步
update t1_deadlock set a = 1000 where a = 1;
这里还是长时间等待的现象,但是这里发生了“死锁”!!

查询死锁

转发:http://blog.csdn.net/yongali/article/details/1680768

SELECT   bs.username "Blocking User", bs.username "DB User",
         ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
         bs.serial# "Serial#", bs.sql_address "address",
         bs.sql_hash_value "Sql hash", bs.program "Blocking App",
         ws.program "Waiting App", bs.machine "Blocking Machine",
         ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
         ws.osuser "Waiting OS User", bs.serial# "Serial#",
         ws.serial# "WSerial#",
         DECODE (wk.TYPE,
                 'MR', 'Media Recovery',
                 'RT', 'Redo Thread',
                 'UN', 'USER Name',
                 'TX', 'Transaction',
                 'TM', 'DML',
                 'UL', 'PL/SQL USER LOCK',
                 'DX', 'Distributed Xaction',
                 'CF', 'Control FILE',
                 'IS', 'Instance State',
                 'FS', 'FILE SET',
                 'IR', 'Instance Recovery',
                 'ST', 'Disk SPACE Transaction',
                 'TS', 'Temp Segment',
                 'IV', 'Library Cache Invalidation',
                 'LS', 'LOG START OR Switch',
                 'RW', 'ROW Wait',
                 'SQ', 'Sequence Number',
                 'TE', 'Extend TABLE',
                 'TT', 'Temp TABLE',
                 wk.TYPE
                ) lock_type,
         DECODE (hk.lmode,
                 0, 'None',
                 1, 'NULL',
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE',
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (hk.lmode)
                ) mode_held,
         DECODE (wk.request,
                 0, 'None',
                 1, 'NULL',
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE',
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (wk.request)
                ) mode_requested,
         TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
         DECODE
            (hk.BLOCK,
             0, 'NOT Blocking',         /**//* Not blocking any other processes */
             1, 'Blocking',             /**//* This lock blocks other processes */
             2, 'Global',          /**//* This lock is global, so we can't tell */
             TO_CHAR (hk.BLOCK)
            ) blocking_others
    FROM v$lock hk, v$session bs, v$lock wk, v$session ws
   WHERE hk.BLOCK = 1
     AND hk.lmode != 0
     AND hk.lmode != 1
     AND wk.request != 0
     AND wk.TYPE(+) = hk.TYPE
     AND wk.id1(+) = hk.id1
     AND wk.id2(+) = hk.id2
     AND hk.SID = bs.SID(+)
     AND wk.SID = ws.SID(+)
     AND (bs.username IS NOT NULL)
     AND (bs.username <> 'SYSTEM')
     AND (bs.username <> 'SYS')
ORDER BY 1;

--------------------------------------------------------------------------------
查询发生死锁的select语句

select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

---------------------------------------------------------
关于数据库死锁的检查方法

一、        数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、        死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、        死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2)用dba用户执行以下语句,可以查看到被死锁的语句。
select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
(select session_id from v$locked_object))

四、        死锁的解决方法
    一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
 经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

  1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;

  2)kill掉这个死锁的进程:

  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

  3)如果还不能解决:

select pro.spid from v$session ses,
v$process pro where ses.sid=XX and
ses.paddr=pro.addr;

  其中sid用死锁的sid替换:

exit
ps -ef|grep spid

  其中spid是这个进程的进程号,kill掉这个Oracle进程。

转载于:https://www.cnblogs.com/yinhaosln/archive/2011/11/30/2268829.html

Oracle 制造死锁和查询死锁相关推荐

  1. oracle test就死,简单说明Oracle数据库中对死锁的查询及解决方法

    死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行 ...

  2. 【Oracle】查看死锁与解除死锁

    1.查询死锁的进程(下面2条语句均可用) 语句1: select sess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_ ...

  3. SQLServer查询死锁

    --查询死锁 select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys ...

  4. oracle 行级死锁_Oracle常见死锁发生的原因以及解决方法

    一.删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. CREATE TABLE testLock( ID NUMB ...

  5. SQL Server监控常规计数器收集参考(mssql阻塞的跟踪查询,死锁的跟踪查询,改善)

    常规计数器收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通过 ...

  6. sql server查询死锁语句

    --查询死锁 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys. ...

  7. mysql查询死锁语句_MYSQL查询数据库死锁和事务的语句

    查看进程信息 SHOW FULL PROCESSLIST ; 查询事务信息 SELECT * FROM information_schema.INNODB_TRX t -- WHERE t.trx_q ...

  8. linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

    qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁,死锁的原因,如何避免 apanying902019-01-09 c ...

  9. SQL Server-聚焦深入理解死锁以及避免死锁建议(三十三)

    前言 终于进入死锁系列,前面也提到过我一直对隔离级别和死锁以及如何避免死锁等问题模棱两可,所以才鼓起了重新学习SQL Server系列的勇气,本节我们来讲讲SQL Server中的死锁,看到许多文章都 ...

最新文章

  1. android与mysql的交互,与Android中的外部SQLite数据库进行交互.
  2. 南昌大学计算机系分数,南昌大学2016年分省分专业录取分数线
  3. Android开发之高仿百度地图底部滑出菜单
  4. lamba List 转 Map
  5. 将 Citavi 笔记按需要导出
  6. Java的8大排序的基本思想及实例解读
  7. 计算机编程常见if语句,if编程搞笑语句
  8. c语言编写cad建筑画图程序,CAD建筑平面图绘图步骤试题.doc
  9. 改进初学者的PID-测量的比例编码
  10. Python 以正弦信号绘制信号
  11. PS中的颜色模式,8位、16位、32位区别、以及背景内容的区别
  12. echarts 路线图 实例 线路图 及线路图特效
  13. Python爬取不羞涩网小姐姐图片——BeautifulSoup应用
  14. SQL Server 修改表,不允许保存更改【解决办法】
  15. 软件测试工程师和技术支持工程师哪个更有钱途,以后会发展更好?
  16. 马光远:阿里巴巴收购雅虎胜算几何
  17. phpexcel删除行_在PHPexcel中删除空行
  18. mysql自定义函数-随机生成人员姓名
  19. 【对比+转载】麦子:我奋斗了18年才和你坐在一起喝咖啡清华大学硕士: 我奋斗了18年,不是为了和你一起喝咖啡
  20. 打胜仗:常胜团队的成功密码

热门文章

  1. python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...
  2. Java JUC工具类--Semaphore
  3. C/C++ main用法总结
  4. Goobuntu:谷歌的内部桌面系统
  5. 白话解说:阻塞和非阻塞,同步和异步
  6. Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
  7. Hystix熔断解决雪崩问题
  8. kafka直连方式消费多个topic
  9. 关于datagrid
  10. Safengine Android so加密