Oracle锁1:DML锁

DML锁,也叫做数据锁(data lock),用于保证在多用户操作数据时数据的完整。DML锁防止相互冲突的DML和DDL操作同时发生。

DML锁有行锁(Row Locks,TX)和表锁(Table Locks,TM),不同的DML操作会自动请求对应的锁。

行锁(Row Locks,TX)

行锁也叫TX锁,用于锁表的一行数据。当一个事务对一行数据做INSERT、UPDATE、DELETE、MERGE或SELECT ... FOR UPDATE操作时,数据将为行添加行锁,直到事务执行了commit或roll back操作后,行锁才释放。

行锁防止两个事务修改同一行数据,当一个事务修改一行数据时,数据库总是为修改的行加一个排它锁以至于其它事务无法修改该行,只有当事务执行了commit或者roll back操作后,数据库才会释放对应的锁。行锁是小粒度的锁,为应用提供了最大限度的并行修改数据的能力。

当一个事务获取了一个行锁,那么这个事务也需要获取这行数据所在表的表锁,表锁阻止有冲突的DDL操作,即数据库会自动的为更新的行添加一个排它锁,并为行所在的表添加一个子排它锁。

行锁和并发

下面通过一个例子来理解行锁和并发的关系。

首先创建下面的表格,并初始化数据:

create table employees(employee_id number(10),salary number(10));
insert into employees(employee_id,salary) values(100,512);
insert into employees(employee_id,salary) values(101,600);
......

步骤一:三个Session同时查询ID为100和101的雇员,查询结果一致

Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

步骤二:Session 1执行更新操作,更新id为100的雇员,在这个更新中,写者将请求一个行锁,阻止其它写者更新这行数据,如果其它写者更新该行数据将被阻塞,直到Session 1提交或者回滚数据

Session 1:
update employees set salary = 612 where employee_id = 100

步骤三:再次执行步骤一的操作

Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				612
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 1的结果是它更新后的数据,而其他两个session任然是旧数据。

步骤四:Session 2更新101雇员的薪水,并且不提交数据,这样Session 2获取了对雇员101的行锁

UPDATE hr.employees SET salary = salary + 100 WHERE employee_id = 101;

步骤五:再次执行步骤1的查询

Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				612
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				700

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

行锁的存储

Oracle将锁信息存储在data block中。数据库用一个队列机制处理行锁请求,如果一个事务请求一个未锁定的行,那么事务将放一个锁到data block,被事务修改的每一行都指向存储在block header中的事务ID的一个拷贝。

当一个事务结束时,事务ID保留在block header中,如果另一个事务想修改一行数据,那么它用这个事务ID判定这个锁是否是激活的。如果锁是激活的,那么当锁被释放时,该事务的session将被通知,否则,事务获取这个锁。

表锁(Table Locks,TM)

表锁,也叫TM锁,当对表执行以下操作时将被请求:INSERT、UPDATE、DELETE、MERGE、SELECT ... FOR UPDATE和LOCK TABLE。请求表锁的DML操作将阻止其它冲突的DDL操作。

表锁有以下的模式:

Row Share(RS)

该锁也叫subshare table lock(SS),表示事务持有表上的锁已锁定表中的行,并打算对其进行更新。Row share锁是最小限制的表锁,为表的行数据的高并发修改提供了支持。

Row Exclusive Table Lock(RX)

该所也叫subexclusive table lock(SX),通常表示持有锁的事务更新了表的行或者执行了SELECT ... FOR UPDATE。SX锁允许其它事务查询、插入、更新、删除或者在同一个表上锁定多行数据,因此,SX锁允许多个事务在同一个表上同时获取SX和RS锁。

Share Table Lock(S)

一个事务持有了表的S锁,任然允许其他事务查询该表格(除了用SELECT ... FOR UPDATE),但只有持有了S锁的事务被允许更新表格。由于多个事务可以同时持有S锁,获取S锁并不能保证事务能够修改表格。

Share Row Exclusive Table Lock(SRX)

该锁也叫share-subexclusive table lock(SSX),比S锁限制更强。在一个表上一个时间点只能有一个事务能获取SSX锁。SSX锁允许其它事务查询表(除了用SELECT ... FOR UPDATE),但是不能更新表。

Exclusive Table Lock(X)

这个锁限制最强,禁止其它事务执行任何类型的DML操作或对表防止任何锁。

时间: 2024-07-31 10:55:54

Oracle锁1:DML锁的相关文章

Oracle TM锁和TX锁

本文主要介绍Oracle中的TM锁,了解当我们通过sql语句访问数据库中的同一表对象时,此时如果多个用户对同一表对象进行操作的话,可能会产生数据不一致,关于数据不一致,请参考数据库事务的一致性和原子性浅析,oracle解决事务在多线程情况下的数据不一致问题,主要是通过两种锁,一种是悲观锁,也就是我接下来要说的,另一种是乐观锁,关于这两种锁的介绍同样也请参考数据库事务的一致性和原子性浅析. TM锁和TX锁就是悲观锁的一部分,那么oracle是怎么通过TM锁TX锁来解决多用户访问同一对象,保证数据一

ORACLE的TM锁和TX锁

根据保护的数据不同,ORACLE的数据库锁分为以下几大类: 1.DML锁(data locks数据锁),用于保护数据的完整性: 2.DDL锁(dictionary locks字典锁),用于保护数据库对象的结构,例如表.索引的结构定义: 3.内部锁或闩(internal locks or latches),用于保护内部结构 在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁. 当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的

理解Oracle TM和TX锁

在Oracle中有很多锁,通过v$lock_type视图可以查看Oracle中所有类型的锁,在本篇文章中我们熟悉一下TM和TX锁的类型 SQL> select * from v$lock_type where type in ('TM','TX'); TYPE NAME ID1_TAG ID2_TAG IS_USER DESCRIPTION -------- --------------- ------------------ ------------------- ------- ------

oracle之事务和锁

一.事务 首先,我们先介绍什么是PL/SQL.什么是PL/SQL?PL/SQL也是一种程序语言,叫做过程化程序语言(procedural Language/SQL),PL/SQL是oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断,循环等操作实习复杂的功能或者计算的程序语言. 1.事务的介绍与应用. 什么是事务,事务是之一个业务逻辑单元执行的一系列操作,这些操作作为一个整体

Oracle事务之一:锁和隔离

Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇到下面的几种情况: 1.Commit:提交事务. 2.RollBack:回滚. 3.DDL语句:执行和提交DDL语句结果前首先提交当前所有DML语句,成为隐式提交. 4.程序正常退出:自动提交. 5.不正常的程序失败:隐式回滚. 二.事务特性 事务的四个特性:A(原子性).C(一致性).I(隔离性)

Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行          ----使用 commit 或 rollback 命令释放锁 ----Oracle 通过使用 INSERT.UPDATE 和 SELECT-FOR UPDATE 语句自动获取行级锁 SELECT-FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其他用户更新该行 ―可以执行除更新之外的其他操作 ―select * from goods whe

Oracle数据库悲观锁与乐观锁详解

数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做. 先从悲观锁开始说.在SqlServer等其余很多数据库中,数据的锁定通常采用页级锁的方式,也就是说对一张表内的数据是一种串行化的更新插

Oracle学习笔记七 锁

锁的概念 锁是数据库用来控制共享资源并发访问的机制. 锁用于保护正在被修改的数据 直到提交或回滚了事务之后,其他用户才可以更新数据 对数据的并发控制,保证一致性.完整性.             并行性 -允许多个用户访问同一数据 一致性 - 一次只允许一个用户修改数据 完整性 - 为所有用户提供正确的数据.如果一个用户进行了修改并保存,所做的修改将反映给所有用户 锁的类型 行级锁:对操作的数据行进行锁定,防止其他用户(连接)进行修改. 表级锁:对整个表进行锁定. 行级锁 对正在被修改的行进行锁

ORACLE查询数据库的锁表情况

  查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name FROM v$process p,v$session a, v$locked_object b,all_objects c WHERE p.addr=a.paddr AND a.process=b.process AND c.object_id=b.object_id 如果表因为某些情况出现死