前言:
当并发大时,会导致数据库的锁不够用。application中会报session错误。
处理:
1.在db2上查看是否打开锁监控:db2 get monitor switches
可以看到如下信息:
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
D:\My Documents\db2\IBM\SQLLIB\BIN>db2 get monitor switches
监视器记录开关
成员 0 的开关列表
缓冲池活动信息 (BUFFERPOOL) = OFF
锁定信息 (LOCK) = OFF
排序信息 (SORT) = OFF
SQL 语句信息 (STATEMENT) = OFF
表活动信息 (TABLE) = OFF
获取时间戳记信息(时间戳记) = ON 2012-10-22 09:03:24.118436
工作单元信息 (UOW) = OFF
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
2.执行以下语句打开锁监控:db2 update monitor switches using lock on
注意:本次修改在db2重启后会失效。
3.通过执行语句:db2 -v get snapshot for db on <dbName>|grep -i lock
可以看到锁情况:
Locks held currently = 1074
Lock waits = 4
Time database waited on locks (ms) = 0
Lock list memory in use (Bytes) = 1142208
Deadlocks detected = 0
Lock escalations = 0
Exclusive lock escalations = 0
Agents currently waiting on locks = 0
Lock Timeouts = 0
Block IOs = Not Collected
Pages from block IOs = Not Collected
Internal rollbacks due to deadlock = 0
Number of MDC table blocks pending cleanup = 0
Memory Pool Type = Lock Manager Heap
若看到Lock list memory in use(Bytes)的值超过locklist中定义的50%,就需要调整locklist的值。
---------------------
其他:
1.查看锁等待的情况:
db2pd -db <dbName> -locks wait showlocksDatabase Partition 0 -- Database NOCARD -- Active -- Up 0 days 00:44:23 -- Date 10/24/2012 10:38:22
Locks:
Address TranHdl Lockname Type Mode Sts Owner Dur HoldCount Att ReleaseFlg
---------------------
以下是官网上的说明:
注解: 通常,打开快照开关所导致的开销非常小,因为在内部,大部分数据已经在 DB2 中。但通常,您只需打开语句开关和锁开关。因为工作负载的缘故,如果将所有开关打开,则可能招致 2% 到 5% 的额外开销。
如果将 maxlocks 设置的太低,那么当对其他并发应用程序仍然有足够的锁定空间时也会发生锁定升级。如果将 maxlocks 设置得太高,那么几个应用程序就可能消耗大多数锁定空间,而其他应用程序将必须执行锁定升级。在此情况下需要锁定升级会导致较差的并行性。
引自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0408hubel/