oracle中的锁

orcle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部。

在oracle数据库中,它并不是对某个表加上锁或者某几行加上锁,锁是以数据块的一个属性存在的。也就是说,每个数据块本身就存储着自己数据块中数据的信息,这个地方叫做ITL(INTERESTRED TRANASCTION LIST),凡是在这个数据块上有活动的事务,它的信息就会记录在这里面供后续的操作查询,保证事务的一致性。

在oracle数据库中,不存在真正意义上属于某个对象或数据的锁。oracle锁的信息是数据块的一个物理属性,而不是逻辑上属于某个表或者某个行。

-----------------------------------------------------------------------------------------------------------------------

按照操作分为DML锁,DDL锁和system locks

首先需要知道的是:

在数据行上只有X锁(排他锁):

在 Oracle 数据库中,当一个事务首次发起一个 DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后, TX 锁被释放,其他会话才可以加锁。

当 Oracle 数据库发生 TX 锁等待时,如果不及时处理常常会引起 Oracle 数据库挂起,或导致死锁的发生,产生ORA-600 的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

DML分为表级锁(TM)与行级(事务)锁(TX)。

TM锁(表级锁)

TM 锁用于确保在修改表的内容时,表的结构不会改变,例如防止在 DML 语句执行期间相关的表被移除。当用户对表执行 DDL 或 DML 操作时,将获取一个此表的表级锁。

当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行 DDL 语句影响记录行的更新。

事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用 LOCK TABLE 语 句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用 LOCK TABLE 显示的定义一个表级的共享锁。

TM 锁包括了 SS、 SX、 S、 X 等多种模式,在数据库中用 0-6 来表示。不同的 SQL 操作产生不同类型的 TM 锁.

TM 锁类型表 

这里写图片描述

TX 锁( 事务锁或行级锁)

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

事务发起第一个修改时会得到TX 锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。

对用户的数据操纵, Oracle 可以自动为操纵的数据进行加锁,但如果有操纵授权,则为满足并发操纵的需要另外实施加锁。

DML 锁可由一个用户进程以显式的方式加锁,也可通过某些 SQL 语句隐含方式实现。 这部分属于 Manual Data Locks。

原理:一个事务要修改块中的数据,必须获得该块中的一个itl,通过itl和undo segment header中的transaction table,可以知道事务是否处于活动阶段。事务在修改块时(其实就是在修改行)会检查行中row header中的标志位,如果该标志位为0(该行没有被活动的事务锁住),就把该标志位修改为事务在该块获得的itl的序号,这样当前事务就获得了对记录的锁定,然后就可以修改行数据了,这也就是oracle行锁实现的原理。

DML 锁有如下三种加锁方式:
    • 共享锁方式( SHARE)
    • 独占锁方式( EXCLUSIVE)
    • 共享更新锁( SHARE UPDATE) 
      其中: 
      SHARE, EXCLUSIVE 用于 TM 锁(表级锁) 
      SHARE UPDATE 用于 TX 锁( 行级锁)

题目:

An employee salary in the non-partitioned EMPLOYEES table, has been updated but the transaction is uncommitted.

Which two types of lock are held by the transaction?

A) an exclusive lock on the EMPLOYEES table

B) a null lock on the EMPLOYEES table

C) a null lock on the row being updated

D) a row level lock on the row being updated

E) a row shared lock on the EMPLOYEES table

答案:A/D

===================================================================================================================================

Table Locks(TM):

当事务通过INSERT、UPDATE、DELETE、MERGE和FOR UPDATE对表进行修改时,就会获得一个表锁,也称为TM锁子句,或锁表语句。DML操作需要表锁来为事务保留对表的DML访问权限,并防止DDL与事务冲突的操作。

Row Share (RS)

这个锁,也称为子共享表锁(SS),表示持有表上锁的事务已锁定表中的行并打算锁定更新它们。行共享锁是表锁中限制最少的一种模式,它为表提供最高程度的并发性。

Row Exclusive Table Lock (RX)

这个锁,也称为subexclusive table lock (SX),通常表示持有锁的事务已经更新了表行或发出了SELECT…FOR UPDATE。SX锁允许其他事务在同一表中同时查询、插入、更新、删除或锁定行。因此,SX锁允许多个事务为同一个表获取同步的SX和子共享表锁。

Share Table Lock (S)

事务持有的共享表锁允许其他事务查询表(除了SELECT…FOR UPDATE),但只允许更新如果一个事务持有共享表锁。由于多个事务可能同时持有一个共享表锁,因此持有此锁不足以确保事务可以修改表。

Share Row Exclusive Table Lock (SRX)

这个锁,也称为共享-subexclusive table锁(SSX),比共享表锁有更多的限制。一次只能获得一个事务SSX锁定给定的表。事务持有的SSX锁允许其他事务查询表(除了SELECT…FOR UPDATE),但不更新表。

Exclusive Table Lock (X)

此锁是最严格的,禁止其他事务执行任何类型的DML语句或将任何类型的锁放在表上。
因为ORACLE要处理不同的并发功能,一旦处理不了那么多并发,就需要排队,为保证排队的公平就会出现各种优先级,因此衍生出很多锁模式,来支持不同业务层的并发需求。
在同一个session里面,你执行一个UPDATE语句,在表上有DML锁,那自己能去做DDL语句吗,比如DROP?

因为是同一个session,所以不涉及并发,自己做一个update不提交,随后drop table也是可以的

行锁:0、6两类锁表锁:0、1、2、3、4、5、6七类锁
0(none)
1(null)
2(RS)
3(RX)
4(S)
5(SRX)
6(X)
R是ROW行,S是SHARE共享,X是eXclusive排他,独占锁的意思

0:null 空
一般的SELECT,在表和行上都是0级锁1:null 空 
1级锁有:Select有时会在v$locked_object出现。 2:Row-S 行共享(RS):共享表锁,sub share  
2级锁有:Lock Row Share,create index online

>>表锁的情况下
locked_mode 2不影响后一个locked_mode 2、3、4、5的会话,如果后一个会话locked_mode为6,则后一个会话操作会提示ora-00054错误。 
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

>>行锁的情况下
locked_mode 2对应行锁0级锁,不影响其他会话。3:Row-X 行独占(RX):用于行的修改,sub exclusive
3级锁有:Insert, Update, Delete, Select for update,Lock Row Exclusive

>>表锁的情况下
locked_mode 3不影响后一个locked_mode 3的会话,但如果后一个会话locked_mode为4,5,6,则后一个会话操作会提示ora-00054错误。 
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

>>行锁的情况下
locked_mode 3的表锁对应行锁6级锁,两个会话对同一行则影响。4:Share 共享锁(S):阻止其他DML操作,share
4级锁有:Create Index, Lock Share5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive  
5级锁有:Lock Share Row Exclusive  
具体来讲有主外键约束时update/delete ... ; 可能会产生4,5的锁。 6:exclusive 独占(X):独立访问使用,exclusive
6级锁有:Drop table, Drop Index, Alter table,Truncate table, Lock Exclusive。

 查看锁类型的具体含义:

select * from V$LOCK_TYPE where type in ('TX','AE','TM','TO','OD');

CREATE INDEX ONLINE
create index online会堵塞update吗?
不会
先执行update后不提交,后执行create index online不会报错,但是create index online一直处于堵塞状态。
先执行create index online后,后执行update正常update,但是如果update不提交,则create index online一直处于堵塞状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值