数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:
DML锁(data locks,数据锁),用于保护数据的完整性;
DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;

在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点;
DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如下图所示:
值  锁模式  锁描述  SQL
0  NONE   
1  NULL  空  SELECT
2  SS(ROW-S)  行级共享锁
其他对象只能查询这些数据行  SELECT FOR UPDATE、LOCK FOR UPDATE、
LOCK ROW SHARE
3  SX(ROW-X)  行级排它锁
在提交前不允许做DML操作  INSERT、UPDATE、DELETE、
LOCK ROW SHARE
4  S(SHARE)  共享锁  CREATE INDEX、LOCK SHARE
5  SSX(S/ROW-X)  共享行级排它锁  LOCK SHARE ROW EXCLUSIVE
6  X(eXclusive)  排它锁  ALTER TABLE、DROP TABLE、DROP INDEX、
TRUNCATE TABLE、LOCK EXCLUSIVE

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

在大概了解oracle的锁机制之后,我们来解决几个基本的问题:
1.UPDATE/DELETE操作会将RS锁定,直至操作被COMMIT或者ROLLBACK;
若操作未COMMIT之前其他session对同样的RS做变更操作,则操作会被hold,直至前session的UPDATE/DELETE操作被COMMIT;

2.session内外SELECT的RS范围
前提:INSERT、UPDATE操作未COMMIT之前进行SELECT;
若在同一session内,SELECT出来的RS会包括之前INSERT、UPDATE影响的记录;
若不在同一session内,SELECT出来的RS不会包括未被COMMIT的记录;

3.SELECT.... FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]
OF cols:只锁定指定字段所在表的RS,而没有指定的表则不会锁定,只会在多表联合查询时出现;
NOWAIT:语句不会hold,而是直接返回错误ORA-0005

oracle中lock的解释相关推荐

  1. oracle中lock和latch的用途

    本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大 ...

  2. oracle中$lock表,哪张视图可以查询中v$lock表的type的具体含义呢?

    sid是会话id, >6就不知道什么意思了. 你贴的这段代码不灵, 是否阻塞了别人看不出来. [PHP]SID LOCKTYPE                    OBJECT_NAME  ...

  3. Oracle中V$SESSION等各表的字段解释,Oracle官方解释

    https://www.cnblogs.com/grey-wolf/p/10119219.html Oracle中V$SESSION等各表的字段解释,Oracle官方解释 阅读目录 一.常用的视图 1 ...

  4. Oracle中的Raw类型解释

    CAST 将某种数据类型的表达式显式转换为另一种数据类型. RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节.  LONG R ...

  5. oracle中imp命令具体解释

    oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文 件.imp使用的基本格式:imp[username[/pas ...

  6. Oracle 中UNDO与REDO的差别具体解释

    一 为了更清楚的看出2者差别,请看下表:                                               UNDO                             ...

  7. oracle中or的替函数,Oracle常用内置Or自定义函数-SQL宝典

    一 .函数使用说明 1.NLSSORT(列名,排序规则) 在oracle9i中新增了按照拼音.部首.笔画排序功能.设置NLS_SORT值 SCHINESE_RADICAL_M   按照部首(第一顺序) ...

  8. oracle中悲观锁定_如何使用悲观锁定修复乐观锁定竞争条件

    oracle中悲观锁定 回顾 在我以前的文章中 ,我解释了使用显式乐观锁定的好处. 然后我们发现,在很短的时间范围内,并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改. 此问题可以描述如下: ...

  9. oracle锁类型tx,Oracle中的锁类型

    Oracle中的锁类型主要分以下3种: DML锁(DML lock):DML 代表数据操纵语言(Data Manipulation Language).一般来讲,表示select,insert,upd ...

最新文章

  1. mybatis 笔记记录
  2. 辅助类BinaryTreeNodeLeftChildRightSibling(左孩子右兄弟,二叉树结点)
  3. 调节Win7系统任务栏预览窗口大小的方法
  4. HashTable数据类型的增删改查操作0404
  5. 【JZOJ3885】【长郡NOIP2014模拟10.22】搞笑的代码
  6. 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”
  7. 拒绝捞回中的效果评估与策略二次调用
  8. BC95-G NB-IOT 模块使用
  9. 全国计算机等级考点申请,全国计算机等级考试(NCRE)考点申请书某高校(367)
  10. 微信公众账号自动回复小程序链接
  11. html5 图片反弹,使用cubic-bezier()创建带有反弹特效的CSS动画
  12. 第3节:alphapose环境配置
  13. java实现人物关系预测_用 NetworkX + Gephi + Nebula Graph 分析人物关系(上篇)
  14. 调整分区 Win7自带磁盘管理工具轻松搞定
  15. getMonth()函数的问题
  16. 机器学习__01__机器学习概述
  17. python视频点播系统_精通Python(微课视频版)/Python开发视频点播大系
  18. 每天一本书不再是问题——快速阅读
  19. 简单谈一谈基于SaaS的餐掌柜项目实战
  20. 鸟笼山剿匪记(爆笑)1铃声 鸟笼山剿匪记(爆笑)1手机铃声免...

热门文章

  1. poco vs Boost
  2. 电脑用久了,学会这几招增加十年寿命,清除电脑里的垃圾方法与流氓软件工具
  3. 正弦信号有效值 c语言,推导正弦波正弦量、平均值、有效值基本公式
  4. cass坡度土方计算案例_南方CASS方格网土方计算心得
  5. 如何在 Centos8 中安装 Lynis审计工具
  6. linux系统常用的中间件
  7. SpringBoot如何验证用户上传的图片资源
  8. Rust 数据类型介绍
  9. nuget打包文件丢失如何使用powershell脚本解决
  10. 如何快速学会别人的代码和思维