Oracle锁基础知识

简介: 001 引言     在任何多用户数据库应用程序中,最终免不了会出现两个用户希望同时使用同一行的情况。数据库必须确保这在物理上不可能实现。事务的隔离性原则要求数据库确保:在一个会话的事务完成之前,另一个会话的事务不能影响此会话。
001 引言
    在任何多用户数据库应用程序中,最终免不了会出现两个用户希望同时使用同一行的情况。数据库必须确保这在物理上不可能实现。事务的隔离性原则要求数据库确保:在一个会话的事务完成之前,另一个会话的事务不能影响此会话。为此,数据库必须对数据的并发访问进行串行化,必须确保即使多个会话请求同一行,它们实际上要按顺序排队。
    借助于记录和表锁定机制,我们可以实现并发访问的串行化。Oracle数据库中的锁定是完全自动的。一般而言,只有在软件用质量较差的代码干扰自动锁定机制时,或业务分析出错导致会使会话发生冲突的业务模型时,才会引发某些问题。

002 共享锁与排它锁
    Oracle数据库中锁定的标准级别保证了最大可能的并发级别。也就是说,如果某个会话正在更新一行,那么只有这行会被锁定。此外锁定这一行只是为了防止其它会话对其进行更新,其它会话可以随时执行读取操作。只有在使用commit或rollback命令结束事务之后,锁定才会被解除。这种锁定是一个“排它(exclusive)”锁:在指定记录上请求排它锁的第一个会话会得到这个锁定,其它请求对该记录进行写访问的会话则必须等待。虽然这一行已通过锁定会话进行了更新,但是对其进行读访问是被允许的(而且经常会出现这种情况),并且这些读操作会涉及撤销数据的使用,从而确保读会话并不会看到任何未被提交的变更。
    对于一行或一个完整表上的排它锁来说,每次只能有一个会话可以获得这个排它锁,不过许多会话可以同时获得同一对象上的“共享(shared)”锁。在一行上设置共享锁毫无意义,其原因在于锁定一行的唯一目的就是不允许其它会话更改它。共享锁被置于整个表上,同时许多会话可以获得同一个表上的共享锁。在一个表上放置共享锁的目的是为了防止另一个会话获得这个表上的排它锁(在已存在共享锁的情况下无法再获得排它锁)。在表上放置排它锁时需要执行DDL语句。如果其它会话已经在一个表上放置共享锁,那么我们就无法执行修改某个对象的语句(例如删除这个表的一列)。
    为了在行上执行DML语句,当前会话必须获得待更改行上的排它锁以及包含这些行的表上的共享锁。如果另一个会话已经获取了待更改行上的排它锁,那么当前会话将被挂起,直至使用commit或rollback命令解除这些锁定。如果另一个会话已经获取了表上的共享锁以及其它行上的排它锁,那么就不存在任何问题。一个表上的排它锁也是允许的,但是,除非DDL语句要求这么做,默认锁定机制是不锁定整个表。
    所有DML语句至少都需要两种锁:受影响记录上的排它锁,以及包含受影响记录的表上的共享锁。排它锁能够防止其它会话干预指定的行,而共享锁则能够组织其它会话使用DDL语句修改表的定义。这两种锁定会被自动请求。如果某条DML语句在指定记录上无法获取所需的排它锁,那么会挂起这条语句直至获得所需的排它锁。
    执行DDL命令需要使用所涉及对象上的排它锁。只有在针对指定表的所有DML事务结束,且行上的排它锁以及表上的共享锁都被解除之后,我们才可以获得执行DDL命令所需的排它锁。任何DDL语句所需的排它锁都是被自动请求的。但是,如果无法获取所需的排它锁(通常是因为其它会话已经获得用于 DML语句的共享锁),那么DDL语句会由于错误立即终止。

003 排队机制
    请求锁定需要排队。如果某个会话请求一个锁定,但由于其它会话已经锁定了指定行或对象而无法获得所需的锁定,那么这个会话将会等待。此时,可能有多个会话都在等待访问相同的记录或对象,在这种情况下,Oracle会跟踪这些会话请求锁定的顺序。当使用锁定的会话解除锁定时,下一个会话将获得授权,以此类推。这种机制被称为“排队(enqueue)”机制。
    如果不希望某个会话在无法获取锁定时进行排队,那么避免排队的唯一方式是使用select...for update命令的wait或nowait子句。因为select语句并不需要任何锁定,所以普通的select语句能够成功地执行,但是,DML语句则会被挂起。


未完待续




相关文章
|
监控 Oracle 安全
Oracle数据库用户频繁被锁问题原因排查及解决
由于应用环境下Oracle用户总是频繁被锁,经常不能执行数据库事务操作,严重影响了系统运行效率。通过问题原因分析及排查,发现了原因,在此记录一下。
3983 0
Oracle数据库用户频繁被锁问题原因排查及解决
|
4月前
|
SQL Oracle 关系型数据库
Oracle-锁解读
Oracle-锁解读
58 0
|
10月前
|
SQL Oracle 关系型数据库
【1024】图说Oracle基础知识
【1024】图说Oracle基础知识
71 0
|
12月前
|
运维 Oracle 关系型数据库
Oracle优化02-锁和阻塞
Oracle优化02-锁和阻塞
86 0
|
12月前
|
SQL Oracle 关系型数据库
Oracle数据库管理员经典试题【Oracle基础知识测试】
Oracle数据库管理员经典试题【Oracle基础知识测试】
82 0
|
SQL Oracle 安全
1 Oracle 基础知识
学习1 Oracle 基础知识。
173 0
|
SQL Oracle 关系型数据库
Oracle 锁表查询及解锁kill进程
1. 查看被锁定的表 SELECT OBJECT_NAME, MACHINE, S.SID, S.
2748 0
|
SQL Oracle 关系型数据库

推荐镜像

更多