RS隔离级别导致的锁超时

客户某个数据库突然锁超时增多.

通过分析db2locktimeout文件, 发现90%的locktimeout的原因都是因为Read Stability隔离级别导致的。
主要涉及的表:P_CUSTOM_ARCH_TABLE,P_CUSTOM_TABLE_ARCH_EXT,P_BUSI_QUERY,P_ALCMNG_PRO。

下面是对db2locktimeout.0.282904.2015-05-13-15-50-08文件的分析:

Cursor Stability:游标稳定性隔离级别(db2默认隔离级别), 只在记录扫描的时候获得行锁,离开后释放。
Read Stability:可重复读隔离级别(was默认隔离级别), 会一直持有扫描过的记录的锁, 直到事务结束。

以下SQL是持锁应用,因为采用的是RS隔离级别,SQL没有结束就一直持有行锁,当行锁数量超过了MAXLOCKS的限制,会发生锁升级, 正如db2diag.log记录的。
select count(*) from PL_PTRX.P_CUSTOM_ARCH_TABLE a  left join PL_PTRX.P_CUSTOM_TABLE_ARCH_EXT c on a.tkiid=c.tkiid,PL_PTRX.P_BU
SI_QUERY b where a.p_piid=b.PIID and b.CLTNAM= ? and a.state= ?

2015-05-13-15.49.35.527820+480 E201222A543        LEVEL: Warning
PID     : 17957114             TID  : 263969      PROC : db2sysc 0
INSTANCE: XXXXX                NODE : 000         DB   : XXXXX
APPHDL  : 0-44637              APPID: XXXXXXXXXX.61297.150513061717
AUTHID  : SF_RPT  
EDUID   : 263969               EDUNAME: db2agent (XXXXX) 0
FUNCTION: DB2 UDB, data management, sqldEscalateLocks, probe:3
MESSAGE : ADM5502W  The escalation of "95133" locks on table "PL_PTRX
          .P_CUSTOM_ARCH_TABLE" to lock intent "S" was successful.
          
以下SQL是等锁应用, 等待P_CUSTOM_ARCH_TABLE表的IX锁, 但是IX和S锁不兼容,所以必须等待,因为持锁的SQL执行时间长,从而导致了锁超时。
insert into Pl_PTRX.P_CUSTOM_ARCH_TABLE( WIID,APP_NAME,TKIID,USER_ID,STATE,EVERYBODY,STAFF_TYPE,PIID,TASK_NAME,PARENT_TEMPL_NAM
E,DISPLAY_NAME,FIRST_ACTIVATION_TIME,LAST_MODIFIED_TIME,PROC_INS_STARTER,PROC_INS_START_TIME,PTID,TKTID,BUSS_NO,BUSS_ID,P_PIID) values(?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?)

locktimeout文件信息:

db2locktimeout.0.282904.2015-05-13-15-50-08

Lock Information:

Lock Name:      0004024C000000000000000054
   Lock Type:      Table
   Lock Specifics: Tablespace ID=4, Table ID=588
   
Lock Requestor:
   System Auth ID:          SF_RPT  
   Application Handle:      [0-7071]
   Application Name:        db2jcc_application
   Lock timeout Value:      30000 milliseconds
   Lock mode requested:     .IX

Context of Lock Request:
   Identification:            UOW ID (2956); Activity ID (9)
   Activity Information:      
      Effective Isolation:    Read Stability
      Statement:              insert into Pl_PTRX.P_CUSTOM_ARCH_TABLE( WIID,APP_NAME,TKIID,USER_ID,STATE,EVERYBODY,STAFF_TYPE,PIID,TASK_NAME,PARENT_TEMPL_NAM
E,DISPLAY_NAME,FIRST_ACTIVATION_TIME,LAST_MODIFIED_TIME,PROC_INS_STARTER,PROC_INS_START_TIME,PTID,TKTID,BUSS_NO,BUSS_ID,P_PIID) values(?,?,?,?,?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?)

Lock Owner (Representative):  
   System Auth ID:          SF_RPT  
   Application Handle:      [0-44637]
   Application Name:        db2jcc_application
   Lock mode held:          ..S

List of Active SQL Statements:

Effective Isolation:    Read Stability
      Statement:              select count(*) from PL_PTRX.P_CUSTOM_ARCH_TABLE a  left join PL_PTRX.P_CUSTOM_TABLE_ARCH_EXT c on a.tkiid=c.tkiid,PL_PTRX.P_BU
SI_QUERY b where a.p_piid=b.PIID and b.CLTNAM= ? and a.state= ?

时间: 2024-10-12 21:28:20

RS隔离级别导致的锁超时的相关文章

可串行化隔离级别里的锁升级

在今天的文章里我会讨论下可串行化(SERIALIZABLE)隔离级别里会有的锁升级(Lock Escalations),还有你如何避免.在上个月的7月14日,我已经介绍了SQL Server里锁升级(Lock Escalations)的基本概念还有为什么需要它们.因此请你回到这个文章来理解下这个非常重要的概念. 可串行化(SERIALIZABLE)隔离级别 可串行化(SERIALIZABLE)隔离级别用来阻止所谓的幻影记录(Phantom Records).为了阻止它们,SQL Server使用

spring 事务隔离级别导致的bug

事情是这样的,ios进货单有一个数量加一手,减一手的功能,每加减一次就会异步调用后台的接口,后台判断sku如果不存在就插入,存在就更新. 问题描述: 当ios发了多次请求后, 在第二次请求的时候,第一次请求插入的sku程序里查不出来 但是数据库里能查出来 后来仔细研究了下,发现这就是所谓的不可重复读情况. 在applicationContext.xml配置文件中的事务相关模块把事务隔离级别提成到SERIALIZABLE. <!-- 进货单加减一手方法存在不可重复读情况,提升事务隔离级别 -->

MySQL事务隔离级别和锁

表结构 create table record( id int auto_increment primary key, title varchar(255) not null, shortName varchar(255) not null, authorId int not null, createTime datetime not null, state int  not null, totalView int default null ); insert into record (titl

数据库隔离级别和锁

数据库隔离级别和事务锁 1.         问题提出 a)         更新丢失 两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了.这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来. b)        脏读 一个事务读取到了另一个事务未提交的数据操作结果.这是相当危险的,因为很可能所有的操作都被回滚. c)         不可重复读 不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结

DB2隔离级别之RR/RS/CS/UR

1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录. 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁.在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁. 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁: 如果是更新, 则加独占锁.具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁:如果是更新,则加独占锁. 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能

数据库的事物隔离级别以及锁的一些个人理解

数据库的 基本分为 共享锁和排它锁 排它锁顾名思义,不能和其他任何所共存. 以SqlServer中某一行数据为例, 特殊的,WithNoLock 这个是不给数据加上任何锁,所以根本和锁没关系 再说update,update的过程是给这条数据加上排它锁,所以当另外事物过来要求修改这条数据的时候,会由于排它锁的互斥,导致无法申请到排它锁,从而实现同一时间只有一个事物对同一条数据进行修改.同样当该条数据正在修改中但其所属的事物还未提交的时候,查询需要在这条数据上加上共享锁的过程也由于排它锁的存在导致被

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

mysql 开发进阶篇系列 12 锁问题(隔离级别下锁的差异)

1. innodb在不同隔离级别下的一致性读及锁的差异 不同的隔离级别下,innodb处理sql 时采用的一致性读策略和需要的锁是不同的,同时,数据恢复和复制机制的特点,也对一些sql的一致性读策略和锁策略有很大影响.对于许多sql, 隔离级别越高,innodb给记录集的锁就越严格(龙其是使用范围条件的时候),产生的锁冲突的可能性也就越高,对并发性事务处理性能的影响也就越大.因此,在应用中,应该尽量使用较低的隔离级别,减少锁争用.通常使用Read Commited隔离级别就足够了, 对于一些确实

Read Commited 隔离级别下锁情况(MVCC实现原理)

如何通过单纯加锁实现RC隔离级别的隔离效果? 对InnoDB引擎下的mysql数据库支持行级锁,通过对事务访问时增加排他锁(X锁)可以防止其他事务的访问,只有在该事务锁提交也就是commit后才可以访问,避免脏读产生.但是在多读的场景下,一个事务假如在进行update操作,后面有许多请求都想要单纯进行读操作(普通的SELECT语句),可是因为有锁的存在只能进行等待.该方法在多读的并发环境下效率大大降低. 真实情况下由于InnoDB在RC和RR隔离级别下使用了MVCC机制,实现了一致性非阻塞读,提