DB2 for Linux, UNIX, and Windows 的锁事件,第 3 部分: 使用 DB2 9.7 中的锁事件监控器来解决并发性问题
2010-08-03 00:00:00 来源:WEB开发网一般来说,死锁或锁超时事件相关的数据集合应当在数据库级激活,因为这些事件通常是应用程序异常。因此,提前限制某种工作负载通常不可能,或根本不需要。另一方面,锁等待事件总会在一定程度上出现。因此将锁等待事件限制到某一工作负载就会有意义。这里给出一般指导原则,就是在为特定的并发性问题决定最佳监控策略前检查这两个选项。
收集某一工作负载的锁超时事件数据
本例中,使用锁事件监控器只收集某一工作负载的锁超时信息。简单起见,不要创建用户定义工作负载。相反使用 DB2 WLM 默认工作负载 SYSDEFAULTUSERWORKLOAD,它包含不属于用户定义工作负载的所有会话。对于 SYSDEFAULTUSERWORKLOAD,锁事件监控器捕获所有锁超时事件。由于已经创建并激活锁事件监控器 EVMON_LOCKING,只要启动所需工作负载的锁事件数据集合,如清单 5 所示。
清单 5. 启动默认用户工作负载的锁超时集合
db2 "ALTER WORKLOAD SYSDEFAULTUSERWORKLOAD COLLECT LOCK TIMEOUT DATA WITH HISTORY"
如选中 WITH HISTORY 选项,锁事件监控器收集:
锁超时事件的出错 SQL 语句
在锁超时事件中涉及的事务内部执行的所有其他 SQL 语句
现在,通过试图使用两个不同会话更改 EMPLOYEE 表来故意引起锁超时。第一个会话中,执行让每个员工提高 2% 薪水的事务,然后查询所有员工姓名和新的薪水。由于该事务未执行(自动执行已通过 DB2 CLP 选项 +c 被停用),它对 EMPLOYEE 表中的每行都持有 X-lock(独占锁),如清单 6 所示。
清单 6. 第一个事务 - 让所有员工薪水提高 2%
db2 "CONNECT TO SAMPLE"
db2 +c "UPDATE EMPLOYEE SET SALARY = SALARY * 1.02"
db2 +c "SELECT LASTNAME, FIRSTNME, SALARY FROM EMPLOYEE ORDER BY LASTNAME ASC"
更多精彩
赞助商链接