专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

oracle常见锁分类及概念(下) oracle锁原理

ins518 2024-10-29 15:15:43 技术文章 13 ℃ 0 评论

接着上篇文章继续讲锁分类

TX锁(行锁)

当事务执行数据库插入、更新、删除操作时,该事务自动获得操作 表中操作行的排它锁。

对用户的数据操纵,Oracle可以自动为操纵的数据进行加锁,但如果有操纵授权,则为满足并发操纵的需要另外实施加锁。DML锁可由一个用户进程以显式的方式加锁,也可通过某些SQL语句隐含方式实现。 这部分属于Manual Data Locks。

DML锁有如下三种加锁方式:

(1)、共享锁方式(SHARE)

(2)、独占锁方式(EXCLUSIVE)

(3)、共享更新锁(SHARE UPDATE)

其中:

SHARE,EXCLUSIVE用于TM锁(表级锁)

SHARE UPDATE用于TX锁(行级锁)。

(1)共享方式的表级锁(Share)

共享方式的表级锁是对表中的所有数据进行加锁,该锁用于保护查询数据的一致性,防止其它用户对已加锁的表进行更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁,共享更新锁可以再施加,但不允许持有共享更新封锁的进程做更新。共享该表的所有用户只能查询表中的数据,但不能更新。

共享方式的表级锁只能由用户用SQL语句来设置,基语句格式如下:

LOCK TABLE <表名>[,<表名>]... IN SHARE MODE [NOWAIT]

执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择项NOWAIT,若该锁暂时不能施加成功,则返回并由用户决定是进行等待,还是先去执行别的语句。

持有共享锁的事务,在出现如下之一的条件时,便释放其共享锁:

A、执行COMMIT或ROLLBACK语句。

B、退出数据库(LOG OFF)。

C、程序停止运行。

共享方式表级锁常用于一致性查询过程,即在查询数据期间表中的数据不发生改变。

(2)独占方式表级锁(Exclusive)

独占方式表级锁是用于加锁表中的所有数据,拥有该独占方式表封锁的用户,即可以查询该表,又可以更新该表,其它的用户不能再对该表施加任何加锁(包括共享、独占或共享更新封锁)。其它用户虽然不能更新该表,但可以查询该表。

独占方式的表封锁可通过如下的SQL语句来显示地获得:

LOCK TABLE <表名>[,<表名>].... IN EXCLUSIVE MODE [NOWAIT]

独占方式的表级锁也可以在用户执行DML语句INSERT、UPDATE、DELETE时隐含获得。

拥有独占方式表封锁的事务,在出现如下条件之一时,便释放该封锁:

(1)、执行COMMIT或ROLLBACK语句。

(2)、退出数据库(LOG OFF)

(3)、程序停止运行。

独占方式封锁通常用于更新数据,当某个更新事务涉及多个表时,可减少发生死锁。

(3)共享更新加锁方式(Share Update)

共享更新加锁是对一个表的一行或多行进行加锁,因而也称作行级加锁。表级加锁虽然保证了数据的一致性,但却减弱了操作数据的并行性。行级加锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。

可通过如下的两种方式来获得行级封锁:

(1)、执行如下的SQL封锁语句,以显示的方式获得:

LOCK TABLE <表名>[,<表名>].... IN SHARE UPDATE MODE [NOWAIT]

(2)、用如下的SELECT ...FOR UPDATE语句获得:

SELECT <列名>[,<列名>]...FROM <表名> WHERE <条件> FOR UPDATE OF <列名>[,<列名>].....[NOWAIT]

一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁的数据行,其它用户只能查询但不能更新被加锁的数据行.如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁.即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。

当出现如下之一的条件,便释放共享更新锁:

(1)、执行提交(COMMIT)语句;

(2)、退出数据库(LOG OFF)

(3)、程序停止运行。

执行ROLLBACK操作不能释放行锁。

1.2.3.2 DDL锁(dictionary locks)

DDL锁用于保护数据库对象的结构,如表、索引等的结构定义。

DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁

(1) 排它DDL锁:

创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。

(2) 共享DDL锁:

需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。

(3) 分析锁:

ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语 句时,ORACLE重新分析编译此语句。

DDL级加锁也是由ORACLE RDBMS来控制,它用于保护数据字典和数据定义改变时的一致性和完整性。它是系统在对SQL定义语句作语法分析时自动地加锁,无需用户干予。

字典/语法分析加锁共分三类:

(1)字典操作锁:

用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时刻仅能对一个字典操作。

(2)字典定义锁:

用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同时改动某个表的结构。

(3)表定义锁:

用于一个SQL语句正当访问某个表时,防止字典中与该表有关的项目被修改。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表