Oracle优化02-锁和阻塞

简介: Oracle优化02-锁和阻塞

思维导图

20161207223832561.png


概述


之前梳理了一篇博文

Oracle-锁解读

首先弄清楚两个概念:

并发 concurrency: 超过两个以上的用户对相同的数据做修改

并行 parallel:将一件事情分成很多小的部分,让每一部分同时执行,最后将执行结果汇总。

事实上,没有并发就没有锁。

锁的产生是因为并发,并发的产生是因为系统需要,系统需要是因为用户需要…….


由唯一性约束引起的阻塞


场景模拟


Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

举个最简单的并发导致锁定的栗子


session 1 :

  1. 查看当前session的id
SQL> select sid from v$mystat where rownum=1;
       SID
----------
        1287


2.创建带有主键的表 ,并插入一条数据

SQL> create table  t(x int primary  key);
Table created
SQL> insert into t(x) values(1);
1 row inserted
SQL> commit;
Commit complete

3.更新数据

SQL>  update t set t.x=666 where t.x=1;
1 row updated


此时,暂时不要commit


紧接着上面的操作,我们再打开一个会话

session 2:

1.查看下当前会话的sid

SQL>  select sid from v$mystat where rownum=1;
       SID
----------
        780


  1. 更新同一条数据
SQL> update t set t.x=666 where t.x=1;

20161208001927870.png


一直执行中。

这个时候,已经发生了锁表 ,具体来说 session2被session1阻塞(session2 was blocked by session1)


锁表场景分析

产生这个现象的原因是什么呢?


我们创建T表的时候,x字段设置为主键,以确保这个列值的唯一性,然后我们在session1中更新x=1的数据, 并没有提交,此时session2 中 也同样的对x=1的数据进行了update .


session1没有提交,此时数据库会认为你还没有决定是否将这条数据更新到库表中,数据库会等待你做决定(提交or回滚)。为了确保数据不重复,数据库只能让session2等待,直到你做出决定。


当然了,我们可以从视图中查看到这些信息


select a.SID, a.TYPE, a.ID1, a.ID2, a.LMODE, a.REQUEST, a.BLOCK
  from v$lock a
 where a.SID in (1287, 780)
 order by a.SID;

20161213214309553.png


AE锁在11g中引入,是一个版本锁.


这里我们分析一下上述的统计结果:


通过select sid from v$mystat; 查到当前session对应的sid .


我们可以知道 session1 的sid=1287 ,session2的sid=780.


BLOCK=1表示表示这个会话正在阻塞其他会话,Requst=6表示当前会话正在等待一个LMODE=6的锁,意思是这个会话正在被阻塞。


在实际的工作中,当我们得知系统卡住了的时候,事实上我们应该逆着这个过程寻根溯源。


首先要查看v$lock表。 通常来讲,系统如果正常运行,突然卡住,多半是被阻塞了,一般来讲需要查看v$lock是否有像上面一样的阻塞信息。


v$lock这个视图需要重点关注的是 request和block 两列。 如果某个sid的request是一个非0的值,那么它就是在等待一个锁,如果block列为1,说明这个sid就持有了一个锁,并且阻塞别人获得这个锁。


锁的类型是由TYPE字段定义, 锁的模式是有LMODE字段定义,ID1和ID2定义了这个锁的相关信息


20161213215307973.png


下面我们继续来看 刚才的图


20161213214309553.png


不难发现,这两列的ID1和ID2的值完全相同,其实这个并非偶然,而是必然。 因为他们本来就是指向同一个资源,只不过一个是持有者(sid=1287),一个是请求等待者(sid=780).


通过这个视图,我们很快发现了问题的所在, session2卡住是因为session1上有个事物没有提交,而在这张表上有要求列值唯一性的约束(表建有主键)。


通过sid,再去查询v$session 视图就可以确定用户的信息了


可以使用如下脚本

 SELECT s.sid, q.sql_text
FROM v$sqltext q, v$session s
WHERE q.address = s.sql_address AND s.sid  in (1287, 780) 
ORDER BY piece;

20161213220510643.png


或者:

http://blog.csdn.net/yangshangwei/article/details/52449489#t1


20161213220640972.png



这种我们通过方式反推系统出现的问题,充其量是一个故障定位(trouble shooting),并不能叫做性能优化,性能优化是一个系统的工程,路还很长…..


引起阻塞的其他情况

select for update

之前有梳理过了,比较简单,不再重复了,请移步

http://blog.csdn.net/yangshangwei/article/details/53021029#t38


外键和索引

之前有梳理过了,比较简单,不再重复了,请移步

http://blog.csdn.net/yangshangwei/article/details/53021029#t39

相关文章
|
13天前
|
存储 Oracle 数据管理
Oracle 12c的自动数据优化(ADO)与热图:数据管理的“瘦身”与“透视”艺术
【4月更文挑战第19天】Oracle 12c的ADO和热图技术革新数据管理。ADO智能清理无用数据,优化存储,提升查询速度,实现数据"瘦身";热图则以直观的视觉表示展示数据分布和状态,助力识别性能瓶颈,犹如数据的"透视"工具。这两项技术结合,强化数据管理,为企业业务发展保驾护航。
|
4月前
|
SQL Oracle 关系型数据库
Oracle-锁解读
Oracle-锁解读
58 0
|
6月前
|
存储 SQL Oracle
Oracle优化避免索引失效
Oracle优化避免索引失效
192 0
|
6月前
|
SQL Oracle 关系型数据库
Oracle优化问题
Oracle优化问题
|
8月前
|
SQL Oracle 关系型数据库
Oracle数据库优化的总结及优化方法
Oracle数据库优化的总结及优化方法
56 0
|
12月前
|
存储 Oracle 关系型数据库
Oracle海量数据优化-02分区在海量数据库中的应用-更新中
Oracle海量数据优化-02分区在海量数据库中的应用-更新中
77 0
|
12月前
|
SQL 存储 Oracle
Oracle海量数据优化-01分区的渊源
Oracle海量数据优化-01分区的渊源
49 0
|
12月前
|
SQL 存储 Oracle
Oracle优化07-分析及动态采样-动态采样
Oracle优化07-分析及动态采样-动态采样
99 0
|
12月前
|
存储 Oracle 关系型数据库
Oracle优化07-分析及动态采样-DBMS_STATS 包
Oracle优化07-分析及动态采样-DBMS_STATS 包
87 0
Oracle优化07-分析及动态采样-DBMS_STATS 包
|
12月前
|
SQL 监控 Oracle
Oracle优化08-并行执行
Oracle优化08-并行执行
72 0

相关实验场景

更多

推荐镜像

更多