为了演示方便首先要造几个锁出来(下面的图中分别使用了DbVisualizer,Sqldbx,命令行,所以截图有点乱,您就将就着看吧)
1.查询锁信息
锁的查询有很多种方式,既可以写SQL语句查询,也可以在命令行里敲命令.对于大多数人来说SQL语句还是相对更直观更简单些.毕竟不是每个人都喜欢在命令行里敲,至少我是没有习惯(水平比较差,没办法)
(1).使用SQL语句查询:
方法1:
SELECT AGENT_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_STATUS,TABNAME,TABSCHEMA FROM SYSIBMADM.SNAPLOCK;
方法2:
SELECT AGENT_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_STATUS,TABNAME,TABSCHEMA FROM TABLE(SNAP_GET_LOCK(,-1));
以上两个SQL语句虽然写法稍有区别,但实际上返回结果是一样的,主要看AGENT_ID, LOCK_MODE,TABNAME,TABSCHEMA 这几列.
AGENT_ID:这个ID在下面需要用到
TABNAME:被锁的表
TABSCHEMA:被锁的表所在的SCHEMA
LOCK_MODE:锁的类型,程序出问题,有时候锁是什么类型并不是特别重要,导致程序出问题的并不一定是死锁,本人是混医疗圈的,曾经有一次遇到一个很让人郁闷的问题,程序的其中一个模块登录以后,什么活都没干呢其他模块就都跑不动了.当时以为有死锁,可查询结果只有几个S锁,翻代码查数据库抓SQL折腾好长时间发现程序登录的时候有个多表关联的查询,其中一个数据量不算太小的表的索引出了问题,查询特别慢,导致了其他模块对表的访问一直在后面排长队等着。
(2).使用命令行查询
在db2cmd里:db2 get snapshot for locks on sample(sample是数据库名)
2.查询锁表的应用
在服务器的db2cmd里:db2 list application,列出当前连接数据库的所有程序进程
下面抓取的结果显示一共有4个进程连接SAMPLE数据库,3个DB2系统进程,1个SQLDBX工具的进程
应用程序名:连接数据库的应用程序的名字
应用程序句柄:这里的句柄就是上面查询锁里显示的AGENT_ID
应用程序标识:这段里面显示的是应用程序的客户端IP地址等信息
数据库名称:这个就不用解释了吧
根据1里查询锁的结果得到的AGENT_ID,在这里找到相应信息,找到锁表的应用程序和IP地址,接下来那就该叫上网管一起干了,看看这个IP地址的那台机器是谁在用,在做什么操作.如果在干坏事儿的话那必须得一顿暴打.
3.解锁
好了,上面查也查了,打也打了.如果产生的是死锁的话,即使关掉锁表的客户端应用,锁也不会马上释放,接下来就需要手动解锁了.
在服务器的db2cmd里:db2 force application(‘agentid’),其中小括号里的agentid就是上面所查询到的应用程序句柄(AGENT_ID).其实这句话把小括号换成all也是可以的,db2 force application all,但是在生产环境上这句话可不能轻易使用,否则你就等着被暴打吧,因为这是要干掉所有的连接.
特别声明:文章来源用户上传并发布,本站只提供信息存储服务,不拥有所有权,内容仅供参考。