锁机制:
确保并发用户在存取同一数据库对象时的正确性。
基本的锁类型:
排他锁:exclusive locks,记为X锁,又叫写锁。
共享锁:share locks,记为S锁,又叫读锁。
锁的使用:
锁将数据资源和单个事务关联起来,当某个资源与拥有它的事务关联在一起时,控制其他事务如何与该资源进行交互。
与该资源关联的事务持有或拥有该锁。
一旦获取了锁,在事务终止之前,就一直持有该锁。事务终止时释放锁。
事务要加的锁与已存在的锁不兼容时,出现锁等待。
锁的属性:
object:锁定的数据资源。表空间、表、行、索引、数据页。
size:锁定资源的物理大小。
duration:持有锁的时间长度。
mode:允许锁的拥有者执行的访问类型,以及并发用户的访问类型。通常称为锁状态。
锁的开销:
锁定需要内存和处理时间
锁转换:
在一个事务中,后面的SQL请求的锁的模式更高时,将发生锁转换。
锁模式由高到低:
表锁:Z>X>U>IX>S>IS>IN
行锁:X>U>S
S锁请求IX锁时(或者IX锁请求S锁),锁转换的结果为SIX锁。
锁释放:
所有的锁在提交或者回滚时都会被释放。除了与指定为with hold的游标相关的表锁。
锁升级:lock escalation
每个锁在内存中都需要一定的空间,为了减少开销,DB2 提供了锁升级机制。
从行级别升级为表级别。
相关参数:
MAXLOCKS 应用程序持有的锁列表的百分比。
LOCKLIST 分配给锁列表的存储容量。
锁等待:
LOCKTIMEOUT
默认是-1,无穷等待。OLAP设置为60s比较好。OLTP设置为10s。开发环境设置为-1.
如果有大量用户,可能需要增加OLTP时间,以避免回滚。
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
寄存器:
CURRENT LOCK TIMEOUT
死锁:
DLCHKTIME
设置死锁检查间隔。死锁检测器(deadlock detector)检测死锁的间隔。发现死锁,返回SQLCODE -911和原因代码2.
默认值是10000ms