技术开发 频道

全面解析DB2数据库的锁等待

到此,我们已经找到了是Transaction handle为2的应用在占用锁没有释放,可以使用下面的命令来查看下,他到底在执行什么。

    db2pd –d sample –transactions

    Transactions:

    Address AppHandl [nod-index] TranHdl Locks State Tflag Tflag2

    Firstlsn Lastlsn LogSpace SpaceReserved TID AxRegCnt GXID

    0x7FC21A80 22[000-00022] 2 3 WRITE 0x00000000 0x00000000 0x000002C1D098 0x000002C1D098 110 174 0x00000000185E 1 0

    查找TranHdl为2的应用,我们可以看到这样的信息,这个应用application handle为22,当前持有3个锁,状态为写。注意,当LogSpace不为0的时候,这个应用一定有未提交的更改操作,这个应用使用日志为110。下面我们查下这个应用在执行什么。

    db2pd -d sample -applications

    Address AppHandl [nod-index] NumAgents CoorEDUID Status C-AnchID C-StmtUID L-AnchID L-StmtUID Appid WorkloadID WorkloadOccID

    0x7AED8080 22[000-00022] 1 4764 UOW-Waiting 0 0 64 1 *LOCAL.DB2.090817071951 1 1

    找application handle为22的应用,然后查找当前语句的句柄标识和上条语句的句柄标识,我们看到,当前这个应用没有正在执行的语句,执行的上条语句是L-AnchID为64, L-StmtUID为1的语句。我们看下这个语句是什么?

    db2pd -d sample –dyn

    Address AnchID StmtUID NumEnv NumVar NumRef NumExe Text

    0x7EAF4370 64 1 0 0 1 1 insert into test_lock values(1,'aaa')。

    通过动态语句的对应(AnchID StmtUID分别为64和1),我们已经找到了锁定的根源,正式上面的语句占用了锁没有释放,导致你执行的查询语句没有返回,中间,我们也理解的一些db2pd的输出,并会利用这些信息分析问题,如果你使用的是9.5或以上的版本,还可以利用更简单的方法知道,这个锁到底在哪一行上,如上面所分析,请求的锁在3号表空间中的5号表上,在表空间的第640页中的第4个槽位。现在我们看下,是锁了哪个对象的哪行记录:

    db2 "select tabname from syscat.tables where tbspaceid = 3 and tableid = 5"

    TABNAME

    ------------------------------------------------

    TEST_LOCK

    锁在TEST_LOCK这个表上,具体是在这个表上的哪行记录呢?根据数据库ROWID的组成,pages为640和slot为4,如果是large tablespace,则rowid转换为整数为:640*65536+4,如果是regular tablespace,则rowid转换为整数为640*256+4,我使用的是large表空间,所以rowid为640*65536+4=41943044。

    根据表和rowid可以直接找到这条记录:

    db2 "select * from test_lock where rid(test_lock)= 41943044 with ur"

    COL COL2

    ----------- ----------

    1 aaa

    结果和上面分析的一样,在TEST_LOCK表上的1’aaa’这行记录上产生的锁等待。注意,上面的语句要使用with ur来执行,否则,你也同样锁等待了。。。。。

    补充一点:

    很多情况下知道数据库的applications handle后,需要知道到底是业务的哪个进程连接过来执行的,可以使用下面的方法来查:

    db2pd -d smaple –agents

    Address AppHandl [nod-index] AgentEDUID Priority Type State ClientPid Userid ClientNm Rowsread Rowswrtn LkTmOt DBName

    0x7AB97A90 22[000-00022] 4764 0 Coord Inst-Active 5120

    XUXIAOF db2bp.exe 245 48 NotSet SAMPLE

    查找application handle为22的应用,对应的ClientPid为5120,就是你连接到数据库上执行这个操作的应用的进程,应用程序的名字(ClientNm)为db2bp.exe。
 

0
相关文章