死锁及oracle死锁--转载

摘要:
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。1)用dba用户执行以下语句selectusername,lockwait,status,machine,programfromv$sessionwheresidin如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。selectsql_textfromv$sqlwherehash_valuein四、死锁的解决方法一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

今天看群里在讨论数据库死锁的问题,也一起研究了下,查了些资料在这里总结下。


所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
关于数据库死锁的检查方法
一、数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
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进程
select A.SQL_TEXT, B.USERNAME, C.OBJECT_ID, C.SESSION_ID,B.SERIAL#, C.ORACLE_USERNAME,C.OS_USER_NAME,C.Process,''''||C.Session_ID||','||B.SERIAL#||'''from v$sql A, v$session B, v$locked_object Cwhere A.HASH_VALUE = B.SQL_HASH_VALUE andB.SID = C.Session_ID

ORACLE锁具体分為以下几类:

1.按用户与系统划分,可以分為自动锁与显示锁

自动锁:当进行一项数据库操作时,缺省情况下,系统自动為此数据库操作获得所有有必要的锁。

显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户為数据库对像设定的。

2.按锁级别划分,可分為共享锁与排它锁

共享锁:共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁為事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。

排它锁:事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。

3.按操作划分,可分為DML锁、DDL锁

+DML锁又可以分為,行锁、表锁、死锁

-行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作 表中操作行的排它锁。

- 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以 防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行 过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用

LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参 考相关文档)。

-死锁:当两个事务需要一组有衝突的锁,而不能将事务继续下去的话,就 出现死锁。

如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4 中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务 1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造 成了死锁。死锁一般是因拙劣的事务设计而產生。

对於查询哪些人或进程被锁使用如下SQL:

SELECT OBJECT_ID,SESSION_ID,SERIAL# ,a.oracle_username,a.os_user_name,a.process

FROM V$LOCKED_OBJECT a ,

V$SESSION WHERE a.SESSION_ID=SID;

解锁能使用SQL下:alter system kill session 'sid,serial#';

或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者 使用其它工具杀掉死锁进程。

+DDL锁又可以分為:排它DDL锁、共享DDL锁、分析锁

-排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。

如使用alter table语句时,為了维护数据的完成性、一致性、

合法性,该事务获得一排它DDL锁。

-共享DDL锁:需在数据库对像之间建立相互依赖关系的DDL语句通常需共享

获得DDL锁。

如创建一个包,该包中的过程与函数引用了不同的数据库表,

当编译此包时,该事务就获得了引用表的共享DDL锁。

-分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使

运行相同语句的应用速度更快。一个在共享池中缓存的对象获得

它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,

ORACLE使用它追踪共享池对象及它所引用数据库对像之间的依赖 关系。当一个事务修改或删除了共享池持有分析锁的数据库对像

时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语 句时,ORACLE重新分析编译此语句。

4.内部閂锁

内部閂锁:这是ORACLE中的一种特殊锁,用於顺序访问内部系统结构。

当事务需向缓衝区写入信息时,為了使用此块内存区域, ORACLE首先必须取得这块内存区域的閂锁,才能向此块内存写入信息。

原文地址及参考文章
http://xinxiangsui2018.blog.163.com/blog/static/106097856201010304532280/
http://www.cnblogs.com/highriver/archive/2011/04/06/2006684.html
另外百度百科介绍的也比较详细
http://baike.baidu.com/view/121723.htm

免责声明:文章转载自《死锁及oracle死锁--转载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python动态生成Bean类,并且带toString,equals,hashcode方法托管DirectX,从MDX到SlimDX的转换(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle数据库三种标准的备份方法

Oracle数据库的三种标准的备份方法: 1.导出/导入(EXP/IMP)。 2.热备份。 3.冷备份。 注释:导出备件是一种逻辑备份,冷备份和热备份是物理备份。 一、导出/导入(Export/Import) 利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回到Oracle数据库中去。 1、简单导出数据(Export)和导...

关于nodejs中遇到mysql默认8小时连接断开机制的终极简单解决方案

由于mysql默认8小时连接无访问,就会断开.为此查了一下资料,有同种比较简单的解决方案: 1. 增加 MySQL 的 wait_timeout 属性的值。  修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置: # Set a connection to wait 8hours in idle status.  wait_tim...

PostgreSQL操作-psql基本命令

一、命令说明psql是PostgreSQL的交互终端,等同于Oracle中的sqlplus。执行该命令连接数据库时, 默认的用户和数据库是postgres二、命令参数-c 命令 :指定psql执行一条SQL命令(用双引号括起),执行后退出。-d 数据库名 :待连接的数据库名称。-f 文件名 :使用文件中的数据作为命令的输入源,在处理完文件后,psql结束并...

Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)

一、(转自:https://blog.csdn.net/majinggogogo/article/details/72123185) 映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert、update、delete、select(增删改查);cache、cache-ref、resultMap、parameterMa...

Python3 连接各类数据库

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。Python 数据库接口支持非常多的数据库,MySQL 、 PostgreSQL、Microsoft SQL Se...

数据库主键到底是用自增长(INT)好还是UUID好

  其实针对使用自增长还是UUID,大家讨论最多的就是速度和存储空间,这里我加入了安全性和分布式,具体对比如下: 使用自增长做主键的优点:1、很小的数据存储空间2、性能最好3、容易记忆使用自增长做主键的缺点:1、如果存在大量的数据,可能会超出自增长的取值范围2、很难(并不是不能)处理分布式存储的数据表,尤其是需要合并表的情况下3、安全性低,因为是有规律的,...