死锁引起的原因一般是多个用户并发访问数据库导致的问题,或是因为某个进程挂死以后资源未释放导致的。通过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;
重新搜集统计信息