死锁问题解决方法

Sqlcode -244 死锁问题解决

一、分析产生死锁的原因

这个问题通常是因为锁表产生的。要么是多个用户同时访问数据库导致该问题,要么是因为某个进程死了以后资源未释放导致的。

如果是前一种情况,可以考虑将数据库表的锁级别改为行锁,来减少撞锁的机会;或在应用程序中,用set lock mode wait 3这样的语句,在撞锁后等待若干秒重试。

如果是后一种情况,可以在数据库端用onstat -g ses/onstat -g sql/onstat -k等命令找出锁表的进程,用onmode -z命令结束进程;如果不行,就需要重新启动数据库来释放资源。

二、方法一

onmode -u 将数据库服务器强行进入单用户模式,来释放被锁的表。注意:生产环境不适合。

三、方法二

1、onstat -k |grep HDR+X

说明:HDR+X为排他锁,HDR 头,X 互斥。返回信息里面的owner项是正持有锁的线程的共享内存地址。

2、onstat -u |grep c60a363c

说明:c60a363c为1中查到的owner内容。sessid是会话标识符编号。

3、onstat -g ses 20287

说明:20287为2中查到的sessid内容。Pid为与此会话的前端关联的进程标识符。

4、onstat -g sql 20287

说明:20287为2中查到的sessid内容。通过上面的命令可以查看执行的sql语句。

5、ps -ef |grep 409918

说明:409918为4中查到的pid内容。由此,我们可以得到锁表的进程。可以根据锁表进程的重要程度采取相应的处理方法。对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sessid的方法杀掉锁表session。否则也可以直接杀掉锁表的进程 kill -9 pid。

四、避免锁表频繁发生的方法 4.1将页锁改为行锁

1、执行下面sql语句可以查询当前库中所有为页锁的表名:

select tabname from systables

where locklevel='P' and tabid > 99

2、执行下面语句将页锁改为行锁

alter table tabname lock mode(row)

4.2统计更新

UPDATE STATISTICS;

4.3修改数据库配置onconfig

OPTCOMPIND参数帮助优化程序为应用选择合适的访问方法。

∙ 如果OPTCOMPIND等于0,优化程序给予现存索引优先权,即使在表扫描比较快时。

∙ 如果OPTCOMPIND设置为1,给定查询的隔离级设置为Repeatable Read时,优化程序才使用索引。

∙ 如果OPTCOMPIND等于2,优化程序选择基于开销选择查询方式。,即使表扫描可以临时锁定整个表。

*建议设置:OPTCOMPIND 0 # To hint the optimizer

五、起停informix数据库

停掉informix数据库

onmode -ky

启动informix数据库

oninit 注意千万别加-i参数,这样会初始化表空间,造成数据完全丢失且无法挽回。

Sqlcode -244 死锁问题解决

一、分析产生死锁的原因

这个问题通常是因为锁表产生的。要么是多个用户同时访问数据库导致该问题,要么是因为某个进程死了以后资源未释放导致的。

如果是前一种情况,可以考虑将数据库表的锁级别改为行锁,来减少撞锁的机会;或在应用程序中,用set lock mode wait 3这样的语句,在撞锁后等待若干秒重试。

如果是后一种情况,可以在数据库端用onstat -g ses/onstat -g sql/onstat -k等命令找出锁表的进程,用onmode -z命令结束进程;如果不行,就需要重新启动数据库来释放资源。

二、方法一

onmode -u 将数据库服务器强行进入单用户模式,来释放被锁的表。注意:生产环境不适合。

三、方法二

1、onstat -k |grep HDR+X

说明:HDR+X为排他锁,HDR 头,X 互斥。返回信息里面的owner项是正持有锁的线程的共享内存地址。

2、onstat -u |grep c60a363c

说明:c60a363c为1中查到的owner内容。sessid是会话标识符编号。

3、onstat -g ses 20287

说明:20287为2中查到的sessid内容。Pid为与此会话的前端关联的进程标识符。

4、onstat -g sql 20287

说明:20287为2中查到的sessid内容。通过上面的命令可以查看执行的sql语句。

5、ps -ef |grep 409918

说明:409918为4中查到的pid内容。由此,我们可以得到锁表的进程。可以根据锁表进程的重要程度采取相应的处理方法。对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sessid的方法杀掉锁表session。否则也可以直接杀掉锁表的进程 kill -9 pid。

四、避免锁表频繁发生的方法 4.1将页锁改为行锁

1、执行下面sql语句可以查询当前库中所有为页锁的表名:

select tabname from systables

where locklevel='P' and tabid > 99

2、执行下面语句将页锁改为行锁

alter table tabname lock mode(row)

4.2统计更新

UPDATE STATISTICS;

4.3修改数据库配置onconfig

OPTCOMPIND参数帮助优化程序为应用选择合适的访问方法。

∙ 如果OPTCOMPIND等于0,优化程序给予现存索引优先权,即使在表扫描比较快时。

∙ 如果OPTCOMPIND设置为1,给定查询的隔离级设置为Repeatable Read时,优化程序才使用索引。

∙ 如果OPTCOMPIND等于2,优化程序选择基于开销选择查询方式。,即使表扫描可以临时锁定整个表。

*建议设置:OPTCOMPIND 0 # To hint the optimizer

五、起停informix数据库

停掉informix数据库

onmode -ky

启动informix数据库

oninit 注意千万别加-i参数,这样会初始化表空间,造成数据完全丢失且无法挽回。


相关内容

  • 分析linux中的死锁处理策略
  • 分析linux中的死锁处理策略 汪建国 摘要:进程死锁问题是操作系统的主要问题之一,很多学者专家一直在研究怎样解决这个问题.本文针对操作系统中经常出现的死锁问题进行了讨论,阐述了死锁出现的原因.四个必要条件,以及死锁的处理方法. 关键词:死锁:死锁产生的原因:死锁产生的条件:死锁的解除与预防:银行家 ...

  • 阻塞与死锁(三)--死锁的定位及解决方法
  • 死锁所在的资源和检测: 在SQL Server的两个或多个任务中,如果某个任务锁定了其他任务试图锁定的资源.会造成这些任务的永久阻塞,从而出现死锁. 下图为例: l  事务T1获得了行R1的共享锁. l  事务T2获得了行R2的共享锁. l  然后事务T1请求行R2的排它锁,但是T2完成并释放其对R ...

  • 数据库并发控制技术(3)
  • 在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读. 3级封锁协议3级封锁协议的内容是:1级封锁协议加上事务T在读取数据之前必须先对其加S锁,直到事务结束才释放.3级封锁协议除防止丢失或覆盖更新和不脏读数据外,还进一步防止了不可重复读和幻想读.例如下图,使用3级封锁协议解决了不可重 ...

  • 多处理机系统的死锁检测方法[综述]
  • 多处理机系统的死锁检测方法 摘要:在多处理机系统中,并发性得到了有效利用,但并发程序的不确定性使得死锁检测十分困难.针对现有的工作集中在使用分析.验证或测试的单一途径来检测死锁这一问题,本文通过分析现有工具的死锁检测能力,提出了综合使用工具的死锁检测方法.同时根据分析.验证和测试途径的不同特点,给出 ...

  • 死锁产生的原因和解锁的方法
  • 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系. 二 ...

  • 预防交叉口死锁的信号配时方法
  • [摘 要]由于交通瓶颈处的排队车辆上溯到上游交叉口,导致的上游交叉口车流不能正常运行.造成这种现象的主要原因是信号配时不合理造成的前车预估不足,后车盲目跟随导致交叉口拥堵.目前,信号配时方法通常假定车辆能够正常通过交叉口实现信号配时,但交通过饱和状态下车辆往往难以正常通过交叉口,形成"死锁 ...

  • 使用P_V操作解决经典进程同步问题
  • 第21卷第2期 2005年4月商丘师范学院学报JOURNALOFSHANGQIUTEACHERSCOLLEGEVol.21No.2April,2005 使用P.V操作解决经典进程同步问题 朱敬鹏,乔丽,王铁柱112 (1.商丘师范学院计算机科学系,河南商丘476000;2.商丘市有线电视台,河南商丘 ...

  • linux死锁检测的一种思路
  • 前言: 上一篇博文讲述了pstack的使用和原理. 和jstack一样, pstack能获取进程的线程堆栈快照, 方便检验和性能评估. 但jstack功能更加的强大, 它能对潜在的死锁予以提示, 而pstack只提供了线索, 需要gdb进一步的确定. 那Linux下, 如何去检测死锁, 如何让死锁的 ...

  • 3-1处理机调度与死锁-作业
  • 第三章 处理机调度与死锁 1.选择题 1.下列算法中,操作系统用于作业调度的算法是. A.先来先服务算法 B.先进先出算法 C.最先适应算法 D.时间片轮转算法 2.在批处理系统中,周转时间是指 A.作业运行时间 B.作业等待时间和运行时间之和 C.作业的相对等待时间 D.作业被调度进入内存到运行完 ...