如何从到DB2数据库的JDBC连接中获取事务信息?

qyuhtwio  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(203)

我正面临一些锁超时问题,我需要更好的工具来找到根本原因。考虑IBM堆栈、WebSphere 8.5和DB2 10.5,并给出如下锁信息:

Lock Information:

   Lock Name:      000301230000000008C0000252
   Lock Type:      Basic RECORD lock(DMS/IXM)
   Lock Specifics: (obj={4;511}, rid=d(0;2440;6), x0000000002A00001)

Lock Requestor:
   ...
   Requesting Agent ID:     28648
   Coordinator Agent ID:    28648
   ...

Lock Owner (Representative):
   ...
   Requesting Agent ID:     295623
   Coordinator Agent ID:    295623
   ...

假设我有两个JDBC事务,一个持有锁,另一个等待释放锁,我如何通过编程方式从JDBC连接(例如代理ID)获取事务信息,以便在我的应用程序中诊断哪个JDBC连接示例持有锁?假设我有一个多线程、多服务器环境。
我在这个链接上看到了一个关于Oracle、SQLServer和PostgreSQL的类似问题:How to get the current database transaction id using JDBC or Hibernate?但我没有找到任何有关DB2的信息
要对锁定原因进行故障排除,我需要找到:

  • SQL锁定表
  • 等待释放锁的SQL
  • 上述SQL中涉及的绑定参数(数据)
vjhs03f7

vjhs03f71#

到目前为止,为了帮助我更好地诊断DB2和WebSphere锁的相关性,我发现需要做以下工作。
首先,我需要知道哪些表发生了死锁。我可以通过发出以下命令之一找到它:

> db2pd -locks showlocks -db SAMPLE
Locks:
Address            TranHdl    Lockname                   Type           Mode Sts Owner      Dur HoldCount  Att        ReleaseFlg rrIID TableNm            SchemaNm 
0x0000A338B812C780 15         01008800050000000000000052 RowLock        ..X  G   15         1   0          0x00200000 0x40000000 0     TABLE               DB2INST1     03008800050000000000000052 SQLP_RECORD (obj={2;136}, rid=d(0;0;5), x0500000000000000)
0x0000A338B812C780 15         01008800000000000000000054 TableLock      .IX  G   15         1   0          0x00202000 0x40000000 0     TABLE               DB2INST1     03008800000000000000000054 SQLP_TABLE (obj={2;136})

然后,我可以根据前面命令的结果查询ROWID:

> db2 connect to SAMPLE
> db2 "select rid(TABLE), COL1, COL2 from TABLE with ur" | grep 0500000000000000

根据表中的行信息(如果处于锁定状态,则不会提交),我可以将其与应用程序关联起来,以发现哪个服务器导致了问题。

相关问题