数据库死锁的检查和解决方法

转自:数据库死锁的检查方法

数据库死锁的检查方法

一、         数据库死锁的现象
程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
二、         死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
三、         死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
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进程。

时间: 2024-10-14 00:50:32

数据库死锁的检查和解决方法的相关文章

64位系统使用Access 数据库文件的彻底解决方法

最近,有PDF.NET用户问我怎么在64位系统下无法访问Access数据库的问题,我第一反应是我怎么没有遇到呢?今天一看自己的VS和Office都是32位版本的,所以在VS里面调试访问Access是没有问题的,但是直接使用编译好的.NET程序访问Access,就出问题了,报: 未在本地计算机上注册“Microsoft.Jet.Oledb.4.0”提供程序. 于是,又在公司的电脑上(Win7 64位)做了实验,发现跟家里面的Win8.1 64位 问题一样,上网搜索了一下,大部分都建议将.NET程序

sqlite:多线程操作数据库“database is locked”解决方法(二)

上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大量数据的情况下,延时会拖慢进度. 想出方法二: 1. 创建一个链表,链接如下格式的结构体,线程1,线程2,线程3......不直接改写数据库,而是把sql语句插入链表中: typedef struct { uint8_t *buf; uint32_t len; } sqlItem_t; 2. 创建一个独立的线

登录oracle数据库提示账户锁定解决方法

问题再现: 由于更改了oracle账户的密码,退出重新连接oracle出现了账户被锁定的情况. 请了百度君出来卸载一下,问题已解决. 在cmd下:sqlplus /nolog 然后:以dba身份登录:conn /as sysdba 解锁: alter user testuser(需要解锁的账户)account unlock; 搞定! 在这里,可能是我修改数据库密码后,没有关闭连接数据库的程序,直接导致了连接的密码错误次数多余10次以上造成的. 登录oracle数据库提示账户锁定解决方法

解决EntityFramework数据库无法自动迁移解决方法

解决EntityFramework数据库无法自动迁移解决方法 如果在迁移数据库执行完一下三个命令没有成功的话请按下面的步骤去进行数据库迁移 1:Enable-Migrations 2:Add-Migration Student. 3:update-database 一般执行以上3个命令都会成功 第一步:删除迁移命令生成的文件夹:Migrations文件夹,重新生成 第二步:执行迁移命令: Add-Migration ,例如:有一个Student的实体类(Model) 为了命名规范,我们一般执行迁

oracle数据库ORA-01654 错误的解决方法

引言: 数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现解决方法只有一个,就 是增加tablespace的大小.现归纳解决此问题的方法如下. 方法1: 当出现类似错误时,首先检查tablespace的空间是否足够大,如果不够大,说明tablespace的空间不够扩展了,这时候需要将tablespace的datafile的 size变大,方法很简单我就不讲

plsql 数据库密码过期的解决方法

最近在登录plsql时,提示your password has experied, 要求让修改数据库密码.以下是解决方法: 1. 在登录plsql的时候,用 sys sys , 注意修改连接为:sysdba 2.找到users 3.找到你的用户名, 点击右键,编辑, 在弹出的窗口中,口令处输入密码,原来的密码,也可以, 4.输入后,点击应用即可

Sqlserver2005附加数据库为只读的解决方法

在sqlserver2005中附加数据库时,附加的数据库会变成只读的,只能进行查询操作. 解决方法 1 打开SqlServer Configuration Manager   开始->Microsoft Sqlserver 2005->配置工具->SqlServer Configuration Manager 2  在SqlServer Configuration Manager 窗口左边选中SQLServer 2005 服务,在窗口右边会出现一些列表项,选中Sqlserver(MSSq

Microsoft SQL Server,附加数据库 错误:Error 916解决方法

错误信息:错误提示:标题: Microsoft SQL Server Management Studio Express ——————————  无法为此请求检索数据. (Microsoft.SqlServer.Express.SmoEnum)  有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&LinkId=20476  —————————— 其他信息:  执行 Transact-SQL 语句或批处

MSSQL数据库已满的解决方法

当前的解决方法是:把硬盘上的其他文件删除,以空出硬盘空间,将数据库的日志文件大小改成无限制,然后分离数据库,要确保分离成功,.然后把数据库日志文件删除(最好是先改名,以防万一).再附加数据库,这样会重建日志文件. 加回去之后,将数据库改成自动收缩,把日志文件改成按mb增长,增长最大设为一个固定的值,值的大小看数据处理情况,存在大指的update操作的话,应设为大一点. 在查询分析器上操作: 清空日志 DUMP TRANSACTION 库名 WITH NO_LOG 截断事务日志: BACKUP L