数据库出现死锁的解决方法参考

  死锁引起的原因一般是多个用户并发访问数据库导致的问题,或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表出现死锁超时,出现:-154 ISAM error: Lock Timeout Expired
  通常情况下,死锁是由于应用设计和数据访问的规划没有优化而产生的,如发生的频率不大,可以忽略。

  处理方案:
  1、收集deadlock的信息
  onstat -g ppf查找当前dlks不为0的会话,获取partnum信息

  2、通过步骤1获取的partnum收集对应tblsnum
  onstat –k查看锁的使用和等待情况,通过tblsnum对应partnum

  3、通过onstat命令获取发生deadlock的SQL
  onstat –g sql 0,从结果中查找当前所有符合sql error code的SQL信息

  4、把table的锁粒度修改为更小的级别
  如修改页级锁为行级锁:
  alter table xxx lock mode(row);
  或
  通过onconfig修改DEF_TABLE_LOCKMODE为ROW重启生效

  5、调整数据库的隔离级别

set isolation to dirty read;
set isolation to commmited read last commited;

  6、缩短锁等待时间

set lock wait to n; (n秒)
set lock wait to not wait;

  7、分析SQL应用逻辑是否合理 主要从多个并发的SQL争用,分析是否有数据进行合理的水平切割

  8、根据SQL分析执行计划是否合理

set explain on avoid_excute;
;
set explain off;

系统自动生成explain.out文件

  9、根据步骤8产生的文件进行分析
  是否未合理使用索引导致执行计划出错,进一步引发了锁资源不能及时释放

  10、若索引合理,判断是否统计信息失效

update statistics medium for table xxx;

  重新搜集统计信息

2 个赞