监视锁定等待和锁定错误

可以查看有关会话、锁定使用情况和锁定等待的信息。

如果应用程序执行 SET LOCK MODE TO WAIT,那么数据库服务器将等待锁被释放,而不是返回一条错误。异乎寻常的长时间等待锁会给用户造成应用程序挂起的印象。

图 1 中,onstat -u 输出显示 会话标识 84 正在等待锁定(Flags 字段第一列中的 L)。要找出锁的所有者,请使用 onstat -k 命令。

图: 显示锁定使用情况的 onstat -u 输出

onstat -u

Userthreads
address  flags   sessid user     tty    wait    tout locks nreads nwrites
40072010 ---P--D 7      gbasedbt -         0       0     0     35      75
400723c0 ---P--- 0      gbasedbt -         0       0     0      0       0
40072770 ---P--- 1      gbasedbt -         0       0     0      0       0
40072b20 ---P--- 2      gbasedbt -         0       0     0      0       0
40072ed0 ---P--F 0      gbasedbt -         0       0     0      0       0
40073280 ---P--B 8      gbasedbt -         0       0     0      0       0
40073630 ---P--- 9      gbasedbt -         0       0     0      0       0
400739e0 ---P--D 0      gbasedbt -         0       0     0      0       0
40073d90 ---P--- 0      gbasedbt -         0       0     0      0       0
40074140Y-BP---81   lsuto    4  50205788       0     4    106     221
400744f0 --BP--- 83     jsmit    -         0       0     4      0       0
400753b0 ---P--- 86     worth    -         0       0     2      0       0
40075760 L--PR--84     jones    3  300b78d8   -1     2      0       0
  13 active, 128 total, 16 maximum concurrent

onstat -k 

Locks
address  wtlist   owner    lklist   type    tblsum rowid  key#/bsiz
300b77d0 0        40074140 0        HDR+S    10002    106        0
300b7828 0        40074140 300b77d0 HDR+S   10197  122     0
300b7854 0        40074140 300b7828 HDR+IX   101e4    0          0
300b78d84007576040074140300b7854 HDR+X  101e4  100     0
300b7904 0        40075760 0            S   10002  106     0
300b7930 0        40075760 300b7904     S   10197  122     0
  6 active, 5000 total, 8192 hash buckets

要找到会话标识 84 正在等待的锁定的所有者,请执行下列操作:

  1. onstat -u 输出的 wait 字段,得到 锁的地址 (300b78d8)。
  2. onstat -k 输出的 Locks address 字段,找到 该地址 (300b78d8)。

    onstat -k 输出中,该行的 owner 字段包含了用户线程的地址 (40074140)。

  3. onstat -u 输出中的 Userthreads 字段 找到该地址 (40074140)。

    onstat -u 输出中,该行的 sessid 字段包含拥有此锁定的会话标识 (81)。

要消除争用问题,您可以让用户平稳地退出应用程序。 如果这种方法还无法解决问题,您可以停止应用程序进程,或者使用 onmode -z 除去会话。