Oracle锁机制

参考:

Oracle锁机制__雪辉_的博客-CSDN博客_oracle锁机制

Oracle锁机制深度分析_gangma2的博客-CSDN博客_oracle锁机制

声明:参考以上文档后的归纳

一、核心总结

锁机制用于管理对共享资源的并发访问。

锁是防止访问相同资源的事务之间的破坏性交互的机制。

用于多用户的环境下,可以保证数据库的完整性和一致性。

二、Oracle两种锁机制


独占锁(Exclusive Lock):即X(写锁)又称排它锁; 

        持有X锁即能对数据进行读取,也能进行修改。如果事务A对数据T加上X锁,则其他事务不能对数据T加如何类型的锁。


共享锁(Share Lock):即S(读锁)

       持有 S锁对数据只能查看,但是无法修改删除。如果事务A对数据对象TS锁,则事务A只能读取T其他事务只能再TS锁,不能加X锁,直到S锁释放掉。这样就保证了其他事务可以读数据对象T,但是不能进行任何修改。

单纯select语句(不加锁),不需要任何锁,所以即使记录被锁定,select语句依然可以执行。

三、Oracle锁类型


DML锁(data locks,数据锁):用于保护数据的完整性,能够防止同步冲突的DML和DDL操作的破坏性交互。(主要关注这一种锁)
DDL锁(dictionary locks,字典锁):用于保护数据库对象的结构,如表、索引等的结构定义。
内部锁和闩(internal locks and latches):保护数据库的内部结构,如数据文件,对用户是不可见的。(不关注)

1、 DML锁

DML锁(数据锁)主要包括TM锁和TX锁,其中TM锁称为意向锁或表级锁,TX锁称为行级锁或事务锁。

        当Oracle执行DELETE,UPDATE,INSERT,SELECT FOR UPDATE DML语句时,Oracle首先自动在所要操作的表上申请TM类型的锁。当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。DML语句能够自动地获得所需的表级锁与行级锁。
  在记录被某一会话锁定后,其它需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,在此情况下,oracle是用到undo的内容进行一致性读来实现的。

1)、TM锁
        表级锁(意向锁)的作用是对并发的操作进行访问控制,例如防止在DML语句执行期间相关的表被修改或删除。当用户对表执行DDL或DML操作时,将获取一个此表的表级锁。表级锁不会影响其他并发的DML操作。

        表级锁的目的有两个:首先保证自身对表的访问不受其它事务DML语句的干扰,其次阻止其它事务中和自身有冲突的DDL操作执行。

2)、TX锁

在数据行上只有X锁(排他锁)
        行级锁(事务锁)的作用是防止两个事务同时修改相同的数据行。

执行DELETE,UPDATE,INSERT或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放

Oracle 同时支持多版本并发访问控制及行级锁技术,因此用户只有在修改相同数据行时才会出现竞争

        读取操作无需等待对相同数据行的写入操作;写入操作无需等待对相同数据行的读取操作。

        当事务获得了某些数据行上的行级锁时,此事务同时获得了数据行所属表上的表级锁。表级锁能够防止系统中并发地执行有冲突的 DDL 操作,避免当前事务中的数据操作被并发地 DDL 操作影响。

2、 DDL锁

1)、排它的DDL锁定(Exclusive DDL Lock)

禁止其他的DDL和DML。

eg: Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

2)、共享的DDL锁定(Shared DDL Lock )

禁止排他的DDL(修改表结构),允许共享的DDL,允许DML(修改表数据)。

eg: create view命令创建视图、CREATE PROCEDURE创建存储过程

四、kill锁的进程

DML类型锁

SELECT L.SESSION_ID "会话ID",
       S.SERIAL# "会话序列号",
       P.SPID "会话进程号",
       S.USERNAME "所属用户",
       S.MACHINE "客户端",
       O.OBJECT_NAME "被锁对象",
       O.OBJECT_TYPE "被锁对象类型",
       CEIL((SYSDATE - S.LOGON_TIME) * 24 * 60 * 60) "被锁时间(S)"
  FROM V$LOCKED_OBJECT L, V$SESSION S, DBA_OBJECTS O, V$PROCESS P
 WHERE L.SESSION_ID = S.SID
   AND L.OBJECT_ID = O.OBJECT_ID
   AND S.PADDR = P.ADDR
   AND S.SCHEMA# <> 0
AND S.USERNAME = 'GANGMA2';

方法一、数据库层面

alter system kill session 'SID,SERIAL#';

方法二、操作系统层面

windows平台:orakill

orakill gangma2 3876

linux平台:kill -9 SPID

kill -9 9876

五、 MySQL和Oracle加锁的基本差异


MySQL

       InnoDB行锁是通过给索引上的索引项加锁来实现的,如果没有索引,InnoDB将通过隐藏的聚集索引来对记录加锁。含间隙锁。

  • Record lock:对索引项加锁。
  • Gap lock:对索引项之间的“间隙”、第一条记录前的“间隙”或最后一条记录后的“间隙”加锁。
  • Next-key lock:前两种的组合,对记录及其前面的间隙加锁。


Oracle
  在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。这样就大大减小了行级锁的维护开销,数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值