实验环境:Oracle RAC 11.2.0.4 (2节点) 1.模拟故障:会话被级联阻塞 2.常规方法:梳理找出最终阻塞会话 3.改进方法:立即找出最终阻塞会话 之前其实也写过一篇相关文章: 如何定位Oracle数据库被锁阻塞会话的根源 但上文给出的例子过于简单,实际对于生产中复杂的阻塞问题,一步步找最终阻塞就比较麻烦.所以本篇旨在寻求更好更快捷的办法. 1.模拟故障:会话被级联阻塞 准备工作:我这里在每个实例开两个会话来模拟RAC在负载均衡模式下的业务会话: 实例1:会话1,会话2; 实例2…
本次场景来源: 通知某个会话:执行execute addupp(1,'five');类似的存储过程,会话等待:(会话等待两种情况:一种确实执行,但是未完成:另一种就是执行的操作无法获取资源,等待资源释放,即锁等待),本次测试锁:行锁等待测试: 本次场景测试:如何快速定位持有锁的会话,kill 释放资源 本次场景操作: 存储过程:执行Update操作,行锁等待,多个会话执行造成:行锁争用,会话被堵塞 模拟环境:行锁如何模拟:争用并发及锁,Lock 有序列,排队 #场景模拟在线: 用户scott,测…
    这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的脚本. -- -- Table structure for table `tableA` -- DROP TABLE IF EXISTS `tableA`; CREATE TABLE `tableA` (   `id` varchar(10) NOT NULL,   `name` varchar(1…
在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果. 问题检测的第2步是获取在进行任何资源等待的会话.下面的脚本会帮助我们获得这些信息.这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名. /*********************************************************…
上周,在SQL Server数据库下面遇到了一个有意思的SQL阻塞(SQL Blocking)案例.其实个人对SQL Server的阻塞还是颇有研究的.写过好几篇相关文章. 至于这里为什么要总结一下这个案例,因为这个案例有点意思: 1:使用DMV视图捕获到的Blocking SQL为一个查询语句(这个不是真正引起阻塞的源头SQL语句),等待事件为LCK_M_S. 2:出现阻塞的会话非常多,阻塞的量非常大,使用DMV视图始终捕获不到相关表的DML操作语句.捕获到全是SELECT语句. 我们知道,在…
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.TEST WHERE OBJECT_ID =1 这个查询语句,其申请.释放的锁资源的过程如下所示: 而且从最常见的锁模式的兼容性表,我们可以看到IS锁与S锁都是兼容的,也就是说SELECT查询是不会阻塞SELECT查询的. 现有的授权模式 请求的模式 IS S U IX SIX X 意向共享 (IS)…
在生产环境中,会有很多使用ReadPast查询提示的场合,来避免正在被其它事务锁定的行对当前查询造成阻塞,而又不会获取到“脏数据”. 可是很多人都疑惑,为什么我使用了ReadPast仍然有时会被阻塞? 首先我们找到联机帮助: READPAST 指定数据库引擎不读取由其他事务锁定的行. 如果指定了 READPAST,将跳过行级锁. 也就是说,数据库引擎将跳过这些行,而不是阻塞当前事务直到锁被释放. 例如,假设表 T1 包含一个单精度整数列,其值为 1.2.3.4 和 5. 如果事务 A 将值 3…
    数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出现频率要控制在一定的范围内,阻塞持续的时间过长或阻塞出现过多(过于频繁),就会对数据库性能产生严重的影响.     很多时候,DBA需要知道数据库在出现性能问题时,有没有发生阻塞? 什么时候开始的?发生在那个数据库上? 阻塞发生在那些SQL语句之间? 阻塞的时间有多长? 阻塞发生的频率? 阻…
SELECT * FROM V$SESSION WHERE USERNAME IS NOT NULL AND STATUS = 'ACTIVE' ORDER BY LOGON_TIME, SID; 1.查询会话 SELECT P.SPID, S.SID, S.OSUSER, S.MACHINE, S.PROGRAM, S.LOGON_TIME, Q.MODULE, S.SERIAL#, Q.SQL_ID, Q.SQL_TEXT, Q.SQL_FULLTEXT FROM V$PROCESS P I…
select dbt.database_id, DB_NAME(dbt.database_id) '数据库名', dbt.transaction_id, at.name, at.transaction_begin_time, case at.transaction_type --事务类型 when 1 then '读/写事务' when 2 then '只读事务' when 3 then '系统事务' when 4 then '分布式事务' end 'transaction类型', case a…