基础知识 2
1. 锁简介 3
2. 锁分类 3
3. dml锁 4
4. dml锁(dictionary locks) 4
死锁 61. 概念 7
2. 原因 7
3. 释放 7
4. sql 8
锁和阻塞 10
1. 概念 11
2. 原因 13
3. dml语句 13
4. 外键没有创建索引 14
latch锁 15
1. 概念 16
2. 有关spin的说明 16
3. 进程获取 latch 的过程 17
4. latch和lock 17
5. latch争用 18
6. 热块产生的原因 19
7. 检查latch的相关sql 22
第1章。1. 锁简介。
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在 oracle 数据库中,它并不是对某个表加上锁或者某几行加上锁,锁是以数据块的一个属性存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,这个地方叫 itl(interested transaction list),凡是在这个数据块上有活动的事务,它的信息就会记录在这里面供后续的操作查询,一保证事务的一致性。
2. 锁分类。
按用户与系统划分,可以分为自动锁与显示锁:
a) 自动锁(automatic locks):当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁。自动锁分dml锁,ddl锁,system locks。
b) 显示锁(manualdata locks):某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。
按锁级别划分,可分为:排它锁(exclusive locks,即x锁)和共享锁(share locks,即s锁)
a) 共享锁(s):共享锁使一个事务对特定数据库资源进行共享访问——另一事务也可对此资源进行访问或获得相同共享锁。共享锁为事务提供高并发性,但如拙劣的事务设计+共享锁容易造成死锁或数据更新丢失。
b) 排它锁(x):事务设置排它锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排它锁。
按操作划分,可分为dml锁(data locks,数据锁)、ddl锁(data dictionary lock)和system locks
3. dml锁。
dml锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性。dml锁主要用于保护并发情况下的数据完整性。它又分为:
a) tm锁(表级锁)
b) tx锁(事务锁或行级锁)
当oracle执行dml语句时,系统自动在所要操作的表上申请tm类型的锁。当tm锁获得后,系统再自动申请tx类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查tx锁相容性时就不用再逐行检查锁标志,而只需检查tm锁模式的相容性即可,大大提高了系统的效率。
在数据行上只有x锁(排他锁)。在oracle数据库中,当一个事务首次发起一个dml语句时就获得一个tx锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行dml语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。
当第一个会话提交后,tx锁被释放,其他会话才可以加锁。
当oracle数据库发生tx锁等待时,如果不及时处理常常会引起oracle数据库挂起,或导致死锁的发生,产生ora-600的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
4. dml锁(dictionary locks)
ddl锁用于保护数据库对象的结构,如表、索引等的结构定义。
ddl锁又可以分为:排它ddl锁、共享ddl锁、分析锁。
a) 排它ddl锁:
创建、修改、删除一个数据库对象的ddl语句获得操作对象的排它锁。如使用altertable语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它ddl锁。
b) 共享ddl锁:
需在数据库对象之间建立相互依赖关系的ddl语句通常需共享获得ddl锁。如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享ddl锁。
c) 分析锁:
oracle使用共享池存储分析与优化过的sql语句及pl/sql程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的ddl锁类型,oracle使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。
当一个事务修改或删除了共享池持有分析锁的数据库对象时,oracle使共享池中的对象作废,下次在引用这条。
sql/plsql语句时,oracle重新分析编译此语句。
ddl级加锁也是由oraclerdbms来控制,它用于保护数据字典和数据定义改变时的一致性和完整性。它是系统在对sql定义语句作语法分析时自动地加锁,无需用户干予。
字典/语法分析加锁共分三类:
a) 字典操作锁:
用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时刻仅能对一个字典操作。
b) 字典定义锁:
用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同时改动某个表的结构。
c) 表定义锁:
用于一个sql语句正当访问某个表时,防止字典中与该表有关的项目被修改。
第2章。1. 概念。
定义: 当两个用户希望持有对方的资源时就会发生死锁。
即两个用户互相等待对方释放资源时,oracle 认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。
例子: 1:用户 1 对 a 表进行 update,没有提交。
2:用户 2 对 b 表进行 update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户 2 此时对 a 表作 update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户 1 又对 b 表作 update,则产生死锁。此时 oracle 会选择其中一个用户进行会滚,使另一个用户继续执行操作。
2. 原因。
oracle 的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。
在 oracle 系统中能自动发现死锁,并选择代价最小的,即完成工作量最少的事务予以撤消,释放该事务所拥有的全部锁,记其它的事务继续工作下去。
从系统性能上考虑,应该尽可能减少资源竞争,增大吞吐量,因此用户在给并发操作加锁时,应注意以下几点:
1) 对于 update 和 delete 操作,应只锁要做改动的行,在完成修改后立即提交。
2) 当多个事务正利用共享更新的方式进行更新,则不要使用共享封锁,而应采用共享更新锁,这样其它用户就能使用行级锁,以增加并行性。
3) 尽可能将对一个表的操作的并发事务施加共享更新锁,从而可提高并行性。
4) 在应用负荷较高的期间,不宜对基础数据结构(表、索引、簇和视图)进行修改。
3. 释放。
如果死锁不能自动释放,就需要我们手工的 kill session。 步骤如下:
1) 查看有无死锁对象,如有 kill session
select 'alter system kill session ''sidserialas deadlock
from v$session
where sid in (select sid from v$lock where block = 1);
如果有,会返回类似与如下的信息:
alter system kill session '132,731';
alter system kill session '275,15205';
alter system kill session '308,206';
alter system kill session '407,3510';
2) kill session:
执行 alter system kill session '391,48398'(sid 为 391);
注意: 应当注意对于 sid 在 100 以下的应当谨慎,可能该进程对应某个。
application,如对应某个事务,可以 kill。
4. sql
1) 查看导致死锁的 sql
select
from v$sqltext q, v$session s
where =
and = sid --这个&sid 是之前查询出来的。
order by piece;
ORACLE学习笔记
rac real application clusters 真实应用集群。ohs oracle http server sga system global area 系统全局区,是系统为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作。实例 存取和控制数据数...
Oracle学习笔记
参数文件 记录了控制文件的位置,控制文件是一个非常小的二进制文件,最大。可以增长到 64mb,控制文件包括如下主要信息 数据库的名字,检查点信息,数据库创建的时间戳 所有的数据文件,联机日志文件,归档日志文件信息 备份信息等 有了这些信息,oracle 就知道那些文件是数据文件,现在的重做日志文件是...
ORACLE学习笔记
目录。oracla管理 1 1.登录sqlplus 1 1.1.sysdba 身份登陆 1 1.2.普通用户登陆sqlplus 1 2.常用命令 1 3.格式化提示符 2 4.查看系统状态 2 4.1.查看实例状态 2 4.2.查看表 2 5.关闭 启动 2 6.创建表空间 3 7.用户和权限 3 ...