<让oracle跑得更快-2> 锁和阻塞

标签: oracle | 发表时间:2015-02-26 22:24 | 作者:足至迹留
出处:http://www.iteye.com
2.1 锁和阻塞
首先,注意区别并发(concurrency)和并行(parallel)两个词。在数据库中,并发的意思是说有超过两个以上的用户对同样的数据做修改(可能包括插入,删除和修改),而并行的意思是说将一件事情分成很多小的部分,让每一部分同时执行,最后将执行结果汇总成最终结果。 没有并发,就没有锁,锁的产生是因为并发

开发人员经常提到的“锁表”其实就是一个会话被另一个会话阻塞。我们可以从一个视图中看到这些信息:
Select sid, type, id1, id2,lmode, request, block from v$lock where sid in (sessionId1, sessionId2) order by sid;
当不知道锁表相关的会话id时,也可以查询到会话信息,可以参考: http://www.iteye.com/topic/571315

关于锁的详细信息这里不多介绍,只是提几点。
(1)TM锁是个表级共享锁,每个用户都可以以共享的方式(lmode=3, lmode是v$lock的一个字段)持有它,这个锁上面,没有阻塞和等待。其实TM锁更像是一个段级的锁,通常我们叫它表锁,是因为我们把它这个表看做一个段,当某个表有几个段的时候,每个段上都会分别加上TM锁。
TM是一个段级的共享锁,它允许同级别(或更低级别)的锁同时设置,但拒绝高级别的锁定请求(DDL操作需要一个更高级别的排他表级锁)。

(2)很多人一看到TX锁,就不由自主想到是一个行级排他锁,这样理解有时候会误导,它的真正目的其实只是维护一个事务的完整性,理解为“事务锁”。在多数情况下,这种事务是更新表的数据,所以给人一种印象,它就是加在数据行上的一个排他锁。它的真正意思是说,这个事务锁会在行级对数据产生影响,比如说阻塞。同样,TM锁也并非是加在表上的一个锁,它会在表的级别上产生影响,比如它不允许其他用户对表做DDL操作。

(3)在oracle里面,并不存在真正意义上的属于某个对象或数据的锁,那需要一个锁管理器,无形中锁管理器自身又产生另一个申请锁的等待,就是等待锁管理器来分配和释放锁。在oracle数据库中,它并不会对某个表上加个锁或某几行加上锁,锁是以数据块的一个属性存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,这个地方叫ITL(Interested Transaction List),凡是在这个数据块上有活动的事务,它的信息就会记录在这里供后续的操作查询,以保证事务的一致性。Oracle不存在锁管理器,申请1000000个锁和申请一个锁的开销是一样的。

2.2 引起阻塞的其他情况
除了由于唯一约束引起的阻塞之外,在生产环境中还经常会遇到下面两种情况引起的阻塞:
(1) select for update,以排他的方式获得这些需要修改行的数据
还可以参考:[url] http://zoroeye.iteye.com/blog/2173694[/url]
(2) 外键没有创建索引
如果你的系统有主外键引用关系,并且满足以下三个条件中的任一个,那么你应该考虑给外键字段创建索引,否则系统的性能可能会下降甚至阻塞。
1) 主表上有频繁的删除操作
2) 主键上有频繁的修改操作
3) 业务上经常会出现主表和从表做关联查询的情况
第一个和第二个条件操作的时候,主表会在从表上创建一个锁定,以保证主表主键的修改不会导致从表的数据在引用上出现问题,这是一个数据引用完整性的要求。如果主表上经常出现这样的删除或是对主键列进行修改的操作,或者每次操作的记录数很多,都将造成从表长时间被锁定,而影响其他用户的正常操作。比如主表每次删除1000行数据,它就需要扫描从表1000次(如果是全表扫描,性能可想而知),以确定每一行记录的改变都不会造成从表数据在引用上的不完整。
还可以参考: http://zoroeye.iteye.com/blog/2182162


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oracle] 推荐:

Oracle 收购 Ksplice

- feng823 - LinuxTOY
实现无需重启即可为 Linux 内核打安全补丁的 Ksplice 被 Oracle 收购. 在被收购前, Ksplice 为 Fedora, Ubuntu 免费提供该功能,对于 RHEL 和 CentOS 则需要订阅其产品. Oracle 表示将把 Ksplice 带来的零宕机安全更新功能添加到 Oracle 产品订阅服务中,同时停止对其他企业级 Linux 发行版的支持,将 Oracle Unbreakable Linux 打造成唯一具备零宕机安全更新功能的企业级 Linux 发行版.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

oracle license计算

- Fenng - eagle&#39;s home
Oracle license的计算是基于CPU core的. 用core的数目乘以一个系数core factor就可以得到所需的oracle license的数目. 对于不同的CPU,core factor是不一样的,可以从oracle提供的这张列表中查到 Oracle Processor Core Factor Table.

Oracle Exadata初探

- - 技术改变世界 创新驱动中国 - 《程序员》官网
在我们看来,它是一个把硬件和软件根据合理的配置整合在一起的 Oracle数据库(在本文编写时是11gR2版本)平台. Exadata数据库机器包含了存储子系统,在存储层上运行着研发的新软件,这使得研发人员可以做一些在其他平台上无法完成的事情. 实际上,Exadata一开始是以一个存储系统形式诞生的,如果你跟参与研发此产品的人交谈,你经常会听到他们称存储组件为Exadata或者是SAGE (Storage Appliance for Grid Environments,网格环境存储设备),这是该产品研发项目的代码名称.

Oracle MySQL Or NoSQL续

- - Sky.Jian 朝阳的天空
接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧. Oracle,MySQL 还是 NoSQL. 随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮. 不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中.

[转]Oracle 碎片

- - 小鸥的博客
  当生成一个数据库时,它会 分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等. 一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space ).

oracle 索引

- - 数据库 - ITeye博客
        自动:在使用primary和unique后系统会自动创建唯一索引.         手动:create   index   索引名  on 表名(字段1,....). 查询表上有哪些索引(网上找的,能用,表名和索引名要大写). 1、查找表的所有索引(包括索引名,类型,构成列):. select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表.

Oracle索引

- - Oracle - 数据库 - ITeye博客
在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. singlecolumnorconcatenated  对一列或多列建所引.

Oracle表空间(tablespaces)

- - 博客园_首页
  我们知道oarcle数据库真正存放数据的是数据文件(data files),Oarcle表空间(tablespaces)实际上是一个逻辑的概念,他在物理上是并不存在的,那么把一组data files 捻在一起就成为一个表空间. 一个数据库可以包含多个表空间,一个表空间只能属于一个数据库. 一个表空间包含多个数据文件,一个数据文件只能属于一个表空间.

Oracle函数介绍

- - CSDN博客数据库推荐文章
在SQL中有两种函数一种是单行函数,一种是多行函数.在sql与pl/sql中都自带了很多类型的函数,比如有字符、数字、日期、转换和混合型等多种函数用于处理单行数据,因此这些都被称为单行函数.这些函数都可以被用于select、where和oder by等子句中.下面我们就来分析单行函数,在这里我列举了oracle中一些常用的单行函数进行操作.希望你所有收获:.