- 浏览: 341560 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (198)
- HIBERNATE (8)
- JAVA (13)
- 数据库 (24)
- SPRING (1)
- LINUX (0)
- 需求管理 (3)
- 职业提升 (6)
- 团队建设 (1)
- 日常用到语句 (1)
- FLEX (6)
- 用户体验 (3)
- 设计模式 (6)
- weblogic (2)
- PowerDesigner (3)
- HTML (7)
- ANT (7)
- 工具. (1)
- bat (5)
- 存储过程 (1)
- strus2 (1)
- DWR (2)
- jfreechart (4)
- 上线测试优化 (17)
- JVM (9)
- 工具使用 (2)
- 算法 (3)
- 私事 (0)
- 数据库-Oracle session (1)
- 软件开发 (5)
- 产品 (2)
- 项目管理 (4)
- oracle语句 (1)
- IntelliJ IDEA (4)
- GRAILS (10)
- Groovy (1)
- JS (1)
- DUBBO (1)
- JAVA EXCEL (3)
- netty websocket (1)
- kafka (1)
- 秘钥体系 (2)
- golang (6)
- gradle (1)
- spring cloud (0)
最新评论
-
wujt:
...
Grails_数据库逆向工程插件 db-reverse-engineer -
yy8093:
我也遇到这个问题,不过并不觉得是个好的方法。。。。不过最后也确 ...
关于dubbo服务产生异常之:Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting s -
wujt:
# ----- Execute The Requested C ...
jconsole基础配置(原创) -
gaowei52306:
你好,请问remotedir="/home/dmwe ...
Ant FTP -
抢街饭:
ant生成日志 在命令行也能看见 怎么去做啊
ant生成日志
oracle 死锁和锁等待的区别(转载)
所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml操作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行操作的时候会等待a提交或是回滚后,才可以继续b的操作
所谓的死锁:当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 deadlock detected while waiting for resource
模拟锁等待:
两个事务a和b,分别创建t1,t2,并且初始化一条数据,
a 更改t1的数据,此时并不提交,这时候b更改相同的一列,此时b一直处于等待的状态
我们可以查询锁等待的内容:
wait_lock.sql
select
(select username from v$session where sid = a.sid) username,
a.sid,
(select serial# from v$session where sid = a.sid) serial#,
a.type,
a.id1,
a.id2,
a.lmode,
a.request,
a.block,
b.sid blocking_sid
from v$lock a,
( select * from v$lock
where request > 0
and type <> 'MR'
) b
where a.id1 = b.id1(+)
and a.id2 = b.id2(+)
and a.lmode > 0
and a.type <> 'MR'
order by username,a.sid,serial#,a.type
此时可以查询到锁等待的现象,最后一列不为空的就是等待的事件
此时我们可以跟a用户提示让其提交事务或是回滚,也可以直接杀死
alter system kill session 'sid,serial#';
保持现状不动,在a事务更改t2表此时在a事务会产生
SQL> update t1 set id=1000 where id=1;
update t1 set id=1000 where id=1
*
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
此时oracle已经帮我解决了这个死锁问题
死锁的产生需要四个必须的条件:
1 ,mutual execution(互斥)资源不能被共享,只能由一个进程使用
2,hold and wait(请求并持续)已经得到资源的进程可以再次申请新的资源
3,no pre-emption(不可剥夺)已经分配的资源不能被相应的进程强制剥夺
4,circular wait(循环等待条件)系统中若干进程组成环路,该环路中的每个进程都在等待相邻进程正占用的资源
定位死锁:
系统级别的定位
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死锁来自于那个程序
语句级别的定位
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));
进程级别的定位
Select s.username,l.object_id,l.session_id,s.serial#,l.oracle_usrename,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;
处理死锁的一般策略
1,鸵鸟算法忽略该问题
2,定位死锁并且恢复
3,仔细对资源进行动态分配,避免死锁
4,破坏死锁中的一个条件
如果oracle解决不了的死锁,我们需要定位到进程级别,找到对应的sid和serial#
alter system kill 'sid,serail#'
失败的话,找到对应的进程强制关闭
Select p.spid from v$session s, v$process p where s.sid=xx and s.paddr=p.addr
ps -ef | grep spid
kill -9 xx
查询oracle的死锁
lock.sql
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;
这些语句的执行最好是在plsql或是sqldeveloper如果是直接在数据库里面执行的需要格式化表,否则会很让你眼花的。
所谓的锁等待:就是一个事务a对一个数据表进行ddl或是dml操作时,系统就会对该表加上表级的排它锁,此时其他的事务对该表进行操作的时候会等待a提交或是回滚后,才可以继续b的操作
所谓的死锁:当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 deadlock detected while waiting for resource
模拟锁等待:
两个事务a和b,分别创建t1,t2,并且初始化一条数据,
a 更改t1的数据,此时并不提交,这时候b更改相同的一列,此时b一直处于等待的状态
我们可以查询锁等待的内容:
wait_lock.sql
select
(select username from v$session where sid = a.sid) username,
a.sid,
(select serial# from v$session where sid = a.sid) serial#,
a.type,
a.id1,
a.id2,
a.lmode,
a.request,
a.block,
b.sid blocking_sid
from v$lock a,
( select * from v$lock
where request > 0
and type <> 'MR'
) b
where a.id1 = b.id1(+)
and a.id2 = b.id2(+)
and a.lmode > 0
and a.type <> 'MR'
order by username,a.sid,serial#,a.type
此时可以查询到锁等待的现象,最后一列不为空的就是等待的事件
此时我们可以跟a用户提示让其提交事务或是回滚,也可以直接杀死
alter system kill session 'sid,serial#';
保持现状不动,在a事务更改t2表此时在a事务会产生
SQL> update t1 set id=1000 where id=1;
update t1 set id=1000 where id=1
*
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
此时oracle已经帮我解决了这个死锁问题
死锁的产生需要四个必须的条件:
1 ,mutual execution(互斥)资源不能被共享,只能由一个进程使用
2,hold and wait(请求并持续)已经得到资源的进程可以再次申请新的资源
3,no pre-emption(不可剥夺)已经分配的资源不能被相应的进程强制剥夺
4,circular wait(循环等待条件)系统中若干进程组成环路,该环路中的每个进程都在等待相邻进程正占用的资源
定位死锁:
系统级别的定位
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死锁来自于那个程序
语句级别的定位
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));
进程级别的定位
Select s.username,l.object_id,l.session_id,s.serial#,l.oracle_usrename,l.os_user_name,l.process from v$locked_object l,v$session s where l.session_id=s.sid;
处理死锁的一般策略
1,鸵鸟算法忽略该问题
2,定位死锁并且恢复
3,仔细对资源进行动态分配,避免死锁
4,破坏死锁中的一个条件
如果oracle解决不了的死锁,我们需要定位到进程级别,找到对应的sid和serial#
alter system kill 'sid,serail#'
失败的话,找到对应的进程强制关闭
Select p.spid from v$session s, v$process p where s.sid=xx and s.paddr=p.addr
ps -ef | grep spid
kill -9 xx
查询oracle的死锁
lock.sql
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;
这些语句的执行最好是在plsql或是sqldeveloper如果是直接在数据库里面执行的需要格式化表,否则会很让你眼花的。
发表评论
-
在oracle10g中如何恢复drop掉的表
2014-11-19 15:17 801在oracle10g中如何恢复drop掉的表 在oracl ... -
左关联右关联全关联
2014-11-10 17:06 3887左关联右关联全关联 参考:http://www.cn ... -
win8系统倒入数据imp-00058错误
2014-09-21 17:52 699win8系统倒入数据imp-00058错误 ... -
oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
2013-12-18 13:09 1508本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个t ... -
查询闪存
2013-12-17 09:36 796(1)查询目标表30分钟前的数据 select * from ... -
ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
2013-08-16 13:35 725ORA-00031: session marked for k ... -
Oracle创建表空间、创建用户以及授权
2013-07-30 11:30 718Oracle创建表空间、创建用户以及授权 创建临时表空间 创 ... -
Oracle中诊断阻塞session的方法 blocking error
2014-10-22 11:36 716Oracle中诊断阻塞session的方法 blocking ... -
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
2013-01-19 13:58 0查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数 ... -
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL
2013-01-19 13:57 2646查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数 ... -
ORACLE阻塞
2013-01-19 13:56 921ORACLE阻塞 案例一: 34.//SYS窗口 35. ... -
数据库阻塞和死锁的区别(转载)
2013-01-19 13:30 1381数据库阻塞和死锁的区别(转载) 数据库阻塞和死锁在程序开发过程 ... -
关于“ORA-00060:等待资源时检测到死锁”问题的分析(转载)
2013-01-19 13:26 1353关于“ORA-00060:等待资源时检测到死锁”问题的分析(转 ... -
查询Oracle正在执行和执行过的SQL语句
2013-01-18 22:55 0查询Oracle正在执行和执行过的SQL语句 ---正在执 ... -
如何检测被锁住的Oracle存储过程(转帖)
2013-01-18 17:39 870如何检测被锁住的Oracle存储过程(转帖) 1.查看是哪 ... -
Oracle死锁的处理
2013-01-18 17:29 742Oracle死锁的处理 Oracle死锁问题应该如何解决呢?可 ... -
oracle 查询所有表的记录数 SQL
2013-01-18 15:06 1306oracle 查询所有表的记录数 SQL create o ... -
oracle enterprise manager console 出现 ora-12154:TNS:无法处理的服务名
2011-11-27 20:23 1193登录oracle enterprise manager con ... -
启动服务报错ORA-12505
2011-10-25 18:23 1469今天在工作中配置plsqldev时,报错误是找不到服务名 同 ... -
ORACLE-数据库导出(exp)/ 导入(imp)
2011-06-09 09:42 1498exp 将数据库内的各对象以二进制方式下载成dmp 文件, ...
相关推荐
Oracle数据库在运行过程中,可能会遇到一种情况,那就是“表死锁”,这会导致多个事务相互等待对方释放资源,从而无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将深入探讨Oracle表...
查询ORACLE死锁以及解锁语句查询ORACLE死锁以及解锁语句
这个图展示了资源的持有者(Blocker)和等待者(Waiter)之间的关系,有助于理解死锁的具体情况。 #### 四、解决Oracle死锁的方法 ##### 4.1 优化SQL语句 确保所有事务中的SQL语句按照相同的顺序执行可以减少死锁...
在深入讨论Oracle解锁和死锁之前,我们首先需要了解Oracle数据库中的锁机制。 1. **共享锁(S)**:允许多个用户读取行,但不允许修改。 2. **排他锁(X)**:允许单个用户修改行,其他用户只能等待。 3. **共享更新锁...
oracle死锁表后处理是数据库管理员和开发人员需要掌握的重要技能,旨在解决oracle数据库中出现的死锁问题,确保数据的一致性和安全性。 oracle锁机制可以分为六种模式:none、null、Row-S、Row-X、Share、...
oracle死锁问题查询代码,仅供参考,有问题大家一起交流
oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!
在Oracle数据库管理中,处理死锁进程和释放状态为killed的session是一项关键技能,尤其对于维护数据库性能和稳定性至关重要。以下将详细阐述如何通过一系列步骤有效地关闭Oracle死锁进程,以及如何释放状态为killed...
3. **使用死锁检测和自动解决机制**:Oracle提供了死锁检测功能,一旦检测到死锁,系统会自动选择牺牲其中一个事务,解决死锁。 4. **优化SQL语句**:合理使用SQL提示(如`/*+ NO_MERGE */`),减少不必要的全表扫描...
Oracle 死锁问题的排查语句 Oracle 死锁是指在数据库中出现的循环等待资源的情形,从而导致数据库性能下降或系统崩溃。出现死锁的原因有多种,如资源竞争、锁定机制不当等。下面是排查 Oracle 死锁问题的语句: 1....
此外,还应知道如何查看和分析Oracle的死锁跟踪文件,以便于诊断和解决实际遇到的死锁问题。 注意,本文的完整代码、相关资料和PDF版本可在作者提供的链接中找到,同时在多个平台有同步更新,便于读者根据自己的...
一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列...
在Oracle数据库系统中,死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外部干预,这些事务将无法继续执行,因为它们都在等待对方释放资源。本篇将详细介绍...
解决Oracle数据库死锁问题,查询出数据库所有死锁,并杀死所有的死锁,解决程序运行问题;
本文将围绕“Oracle查询死锁表”的主题展开详细讨论,旨在帮助数据库管理员更好地理解和掌握如何检测及解除Oracle中的死锁现象。 ### 一、理解Oracle死锁 #### 1.1 定义 死锁通常发生在两个或更多的事务试图同时...
在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...
执行查询语句查询Oracle是否有死锁,以及叫你如何解锁。
编译的存储过程的时候,程序死住,等待一会出现ora-04021错误解决办法。文档中有查询思索的语句,以及杀掉死锁进程的方法。