Oracle优化02-锁和阻塞
思维导图
概述
之前梳理了一篇博文
Oracle-锁解读
首先弄清楚两个概念:
并发 concurrency: 超过两个以上的用户对相同的数据做修改
并行 parallel:将一件事情分成很多小的部分,让每一部分同时执行,最后将执行结果汇总。
事实上,没有并发就没有锁。
锁的产生是因为并发,并发的产生是因为系统需要,系统需要是因为用户需要…….
由唯一性约束引起的阻塞
场景模拟
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
举个最简单的并发导致锁定的栗子
session 1 :
- 查看当前session的id
SQL> select sid from v$mystat where rownum=1; SID
----------
1287
2.创建带有主键的表 ,并插入一条数据
SQL> create table t(x int primary key);Table createdSQL> insert into t(x) values(1);1 row insertedSQL> 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
- 更新同一条数据
SQL> update t set t.x=666 where t.x=1;
一直执行中。
这个时候,已经发生了锁表 ,具体来说 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.BLOCKfrom v$lock awhere a.SID in (1287, 780)order by a.SID;
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定义了这个锁的相关信息
下面我们继续来看 刚才的图
不难发现,这两列的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;
或者:
http://blog.csdn.net/yangshangwei/article/details/52449489#t1
这种我们通过方式反推系统出现的问题,充其量是一个故障定位(trouble shooting),并不能叫做性能优化,性能优化是一个系统的工程,路还很长…..
引起阻塞的其他情况
select for update
之前有梳理过了,比较简单,不再重复了,请移步
http://blog.csdn.net/yangshangwei/article/details/53021029#t38
外键和索引
之前有梳理过了,比较简单,不再重复了,请移步
http://blog.csdn.net/yangshangwei/article/details/53021029#t39
Oracle优化02-锁和阻塞相关推荐
- oracle锁概念,阻塞
一.锁(Lock) 1.1 锁的概念 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据 ...
- oracle dba_waiters中的lockid是什么,查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL...
查询Oracle中的阻塞锁(以及阻塞在哪个数据上)的SQL 数据库阻塞检查处理方法 当应用服务器发生阻塞时(特别是集群1),应先按下面方法检查数据库,以判明应用服务器阻塞是否由数据库阻塞引起. 如果 ...
- 锁 死锁 阻塞 Latch 等待 详解
锁这东西是纯概念性的东西,但是作用又非常大.以前整理过两篇文章,今天又看了点书,觉得还不是很清楚.就重新整理了下.在想要不要把以前的文章删掉,这样在blog里是比较简介的,但后来又一想.这些连接在其他 ...
- Oracle 优化和性能调整
Oracle 优化和性能调整 分析评价Oracle数据库性能主要有数据库吞吐量.数据库用户响应时间两项指标.数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即: 数据库用户响应时间=系统 ...
- oracle 10046 看锁,Maclean教你读Oracle 10046 SQL TRACE
有同学一直向Maclean反应希望做一期10046 SQL trace的教程, 正好这几天有空 我们就理一理. 为什么我们要使用10046 trace? 10046 trace帮助我们解析 一条/多条 ...
- oracle中oltp,针对OLTP和OLAP业务系统的Oracle优化思想
关于OLTP和OLAP系统的OLT优化和优化方法的差异的摘要. Oracle优化方法差异的摘要. 从使用模型来看olap系统和oltp系统,当前的主流应用软件系统可以分为交易处理系统和分析处理系统两种 ...
- Oracle优化器:星型转换
Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询.星型查询语句多用于基于星型模型设计的数据仓库应用中.星型模型的称谓源于该种模型以图形 ...
- Oracle的悲观锁和乐观锁
为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定. 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫 ...
- Oracle优化07-分析及动态采样-DBMS_STATS 包
思维导图 07系列文章 Oracle优化07-分析及动态采样-直方图 Oracle优化07-分析及动态采样-DBMS_STATS 包 Oracle优化07-分析及动态采样-动态采样 DBMS_STAT ...
- Oracle关于TX锁的一个有趣的问题
前阵子有一个网友在群里问了一个关于Oracle数据库的TX锁问题,问题原文如下: 请教一个问题: 两个会话执行不同的delete语句,结果都是删除同一个行.先执行的会话里where条件不加索引走全表扫 ...
最新文章
- 二叉树中序遍历方法实现
- 微信小程序一些知识点
- Qt学习之路(17): Qt标准对话框之QMessageBox
- Python应用实战-从pandas的角度来对比MySQL,教你如何更快更好的学习sql
- Linux串口转远程串口,linux虚拟串口及远程访问
- 组策略里更改更新和设置客户端首页
- wireshark-抓包极简使用教程
- python3字典列表_python3_列表、元组、集合、字典
- 用友nccloud 虚拟机
- Copula、CoVaR、Garch、DCC、藤Vine、BEKK、SV、ECM
- 剑指Offer(第二版)-思路简述-第一期(简单难度)
- 页面跳转之前显示等待 wating ------
- Visual Studio 增加每行最多字符数限制参考线
- (费用流)洛谷P2469 [SDOI2010]星际竞速
- Stack frame omission (FPO) optimization part1
- getWindow().getDecorView().setSystemUiVisibility(...)设置状态栏属性
- 两张图读懂Saas Paas Iaas
- data from cuda to cpu
- Java跨年祝福语代码_跨年祝福语大全
- HTML5网页页面无刷新更新页面URL
热门文章
- IntelliLight: a Reinforcement Learning Approach for Intelligent Traffic Light Control 论文阅读
- python super 理解(四)
- 未排序数组中累加和为给定值的最长子数组系列问题
- pytorch 学习笔记目录
- 文巾解题 203. 移除链表元素
- MATLAB实战应用案例:欧拉法、改进欧拉法、ode45求解微分方程实例
- 360手机麦克风测试软件,【奇酷小技巧】教你无需ROOT增大话筒、听筒和外放声音!...
- linux进程接受信号,linux – 一个进程如何知道它已经收到一个信号
- 微服务实战(四):服务发现的可行方案以及实践案例
- spring boot整合mail