- 爱易网页
-
数据库教程
- DB2 锁跟并发
日期:2014-05-16 浏览次数:20456 次
DB2 锁和并发
DB2 锁和并发
--学习资料整理
主要内容:
锁等待
锁升级
死锁
一、锁等待
1、锁等待:当应用程序对一个对象请求的锁不能够立刻得到时,该程序将进入一个等待服务的队列,等待占用该锁的应用程序提交或回滚来释放该锁。
2、锁定超时检测,能够防止应用程序在异常情况下无限制地等待释放锁定。
3、locktimeout参数配置任何应用程序应等待获取锁定的最长时间,这样可以帮助避免全局死锁的情况发生。如果锁定请求处于暂挂的时间大于locktimeout值,那么请求应用程序将收到错误(-911)并将其事务回滚。
locktimeout的默认值为-1,它关闭锁定超时检测。如果该值为-1,则应用程序将会出现无穷锁等待现象。
4、对于生产系统中的OLAP,一开始为60秒比较好,对于OLTP大约为10秒比较好。对于开发环境,应该使用-1,以识别和解决锁等待的情况。如果有大量的并发用户,则可能需要增加OLTP时间,以避免回滚。
5、如果快照监控结果输出中“Lock Timeouts”是一个较高的数,那么可能原因有:
a、LockTimeOut的值太低
b、某个事物持有锁的时间有所延长
c、锁升级
6、锁等待可能造成如下结果:
a、引起死锁(死锁是锁等待的一个特例),有死锁检测器处理;
b、等待超时,等待的应用程序返回SQLCODE -911和原因码68,并自动回滚;
c、如果locktimeout的值被设置为-1,则应用程序将永远等待,直到能够获得所需要的锁;
d、对于行、表、数据分区和MDC块锁定,应用程序可根据业务逻辑需要使用SET CURRENT LOCK TIMEOUT 来覆盖数据库级别的locktimeout设置。
7、锁等待问题解决流程和步骤:
a、把数据库监控开关打开:
db2 update dbm cfg using DFT_MON_LOCK on DFT_MON_STMT on
db2 update montitor switches using lock on sort on bufferpool on uow on table on statement on
补充:
查看数据库的参数配置(前提:连接上数据库):
db2 get db cfg
b、监控SQL脚本:
select agent_id, substr(stmt_text, 1, 100) as statement, stmt_elapsed_time_ms from table(snapshot_statement('SAMPLE', -1)) as b
where agent_id in (select agent_id_holding_lk from table(snapshot_lockwait('SAMPLE', -1)) as a order by lock_wait_start_time asc fetch first 20 rows only ) order by stmt_elapsed_time_ms desc
;--(这个脚本非常使用,要熟记)
此语句会按照执行时间的长短的先后顺序排列出所有造成lockwait的SQL语句。
c、可以将上述的a和b写到shell脚本中,每隔30秒运行一次,把监控结果输出到一个文件中;
d、一旦定位引起锁等待的SQL后,若改SQL语句写的效率很低,可以考虑对该SQL调优;若该SQL没有创建最合理的索引,尝试使用db2advis工具为引起锁等待的SQL创建最合理的索引;
e、如果创建索引和调优SQL仍然不能解决问题,考虑能否根据业务逻辑选择UR隔离级别。但这种方式只能解决读的问题;
f、在业务逻辑允许的情况下,考虑设置DB2_EVALUNCOMMITTED、DB2_SKIPDELETED和DB2_SKIPINSERTED来提高并发;
g、最后考虑能否对引起锁等待的SQL语句关联的表做数据归档、业务分离等。
总结:以前,只能在数据库级别通过更改locktimeout数据库配置参数的值来指定锁定等待超时时间。锁定等待策略通过新的SET CURRENT LOCK TIMEOUT可以在语句级别指定(DB2 V9.5以后),此语句更改CURRENT LOCK TIMEOUT专用寄存器的值。CURRENT LOCK TIMEOUT专用寄存器指定在返回指示不能获取锁定的错误之前等待锁定的秒数。
8、捕获引起锁等待的SQL。使用db2pd监控工具找到正在等待的锁定的所有者,然后再找出相应的SQL语句进行调整。
a、判断数据库中是否存在大量锁等待,使用get snapshot for database来监控
db2 get snapshot for database on prod | grep -i lock