• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > 讲解Oracle数据库中结束死锁进程的一般方法

讲解Oracle数据库中结束死锁进程的一般方法

作者:银志辉 字体:[增加 减小] 来源:互联网 时间:2017-05-11

银志辉通过本文主要向大家介绍了杀死oracle死锁进程,oracle数据库死锁,查询oracle数据库死锁,oracle数据库死锁解决,查看oracle数据库死锁等相关知识,希望本文的分享对您有所帮助

1、查看死锁
1)用dba用户执行以下语句

select username,lockwait,status,machine,program from v$session where sid in
 (select session_id from v$locked_object)
</div>

如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
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))
</div>

2、死锁的解决方法
1)查找死锁的进程:

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;
</div>

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

alter system kill session ‘sid,serial#'; (其中sid=l.session_id)
</div>

3)如果还不能解决:

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

其中sid用死锁的sid替换:


--ORACLE 就是查表,需要SYSTEM,SYS(有相应权限的用户)执行下面的SQL语句就可以了查看锁代码

SELECT sn.username,
    m.SID,
    sn.SERIAL#,
    m.TYPE,
    DECODE(m.lmode,
       0,
       'None',
       1,
       'Null',
       2,
       'Row Share',
       3,
       'Row Excl.',
       4,
       'Share',
       5,
       'S/Row Excl.',
       6,
       'Exclusive',
       lmode,
       LTRIM(TO_CHAR(lmode, '990'))) lmode,
    DECODE(m.request,
       0,
       'None',
       1,
       'Null',
       2,
       'Row Share',
       3,
       'Row Excl.',
       4,
       'Share',
       5,
       'S/Row Excl.',
       6,
       'Exclusive',
       request,
       LTRIM(TO_CHAR(m.request, '990'))) request,
    m.id1,
    m.id2
 FROM v$session sn, v$lock m
 WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞 
  OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定 
    AND m.request = 0 AND lmode != 4 AND
    (id1, id2) IN (SELECT s.id1, s.id2
             FROM v$lock s
            WHERE request != 0
             AND s.id1 = m.id1
             AND s.id2 = m.id2))
 ORDER BY id1, id2, m.request;

</div>

3、避免死锁
如果两个事务需要访问相同的一组表,那么在两个事务中按相同的顺序对这组表加锁通常能避免多表死锁。例如,如果系统中的一个主表及一个明细表都需要更新时,开发者应该遵从一定的规则,如先对主表加锁,再对明细表加锁。如果能够仔细设计类似的规则并严格执行,就能从根本上杜绝死锁的产生。    如果开发者预先知道需要在同一事务内对一系列资源加锁,那么应考虑首先对排他性最高的资源加锁。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 讲解Oracle数据库中结束死锁进程的一般方法
  • Oracle删除死锁进程的方法

相关文章

  • 2017-05-11oracle中的procedure编写和使用详解
  • 2017-05-11在OracleE数据库的字段上建立索引的方法
  • 2017-05-11Oracle 当前用户下所有表的记录总数
  • 2017-05-11oracle 数据泵导入导出介绍
  • 2017-05-11Oracle SecureFile的功能第1/4页
  • 2017-05-11oracle中rownum和row_number()
  • 2017-05-1145个非常有用的 Oracle 查询语句小结
  • 2017-05-11oracle创建表空间、授权、创建用户、导入dmp文件
  • 2017-05-11bitmap 索引和 B-tree 索引在使用中如何选择
  • 2017-05-11Oracle实现行转换成列的方法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 解决plsql连接失败,弹出空白提示框的方法详解
    • oracle下巧用bulk collect实现cursor批量fetch的sql语句
    • 关于系统重装后Oracle数据库完全恢复的解决办法
    • ORACLE 超长字符串问题的解决办法
    • oracle数据库在客户端建立dblink语法
    • oracle10g发送email示例
    • Oracle客户端与plsql查询数据乱码修改成中文的快速解决方法
    • ORACLE常见错误代码的分析与解决(二)
    • oracle数据库中查看系统存储过程的方法
    • Linux 7下脚本安装配置oracle 11g r2教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有