1。找到被锁表的partnum:select hex(partnum) from systables where tabname = ”tmp”;
2。onstat -k|grep partnum 找到该锁的owner;
3。onstat -u | grep owner 找到用户会话session号;
4。onmode -z sesid 杀掉该session;
5。如果第4步失败,则进一步onstat -g ses | grep sesid 找到该发起该会话的pid;
6。kill pid 或 kill -9 pid;
7。特殊情况:在第2步中,如果发现锁的owner为0,则检查:
onstat -x
onstat -G
看是否存在全局事务,若有全局事务,则继续以下步骤:
select hex(tx_addr) trans_addr,hex(tx_lklist) lock_addr from systrans where hex(tx_addr) like '%c000000007674c58%';
需要说明的是,c000000007674c58是全局事务的地址。
上面SQL语句提供出该全局事务对应的锁地址,这时如果得到的锁地址与锁表的锁地址相同的话,你就需要从应用端(通常是三层结构的中间件)发命令让该全局事务回滚或提交,否则该锁会被一直持有,直到你执行oninit -i。
结论:如果指定无限制的锁等待(set lock mode to not wait) 这并不是一个好方法。这会加剧锁冲突和死锁现象的出现,这是一个不好的编程习惯。
我设置成这样,set lock mode to wait 10;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11517198/viewspace-606435/
,如需转载,请注明出处,否则将追究法律责任。