Oracle锁的基本机制

时间:2017-08-03 来源:

1.什么是锁

锁(LOCK)用于管理对共享资源的并发控制。通过建立锁,可以保护资源(数据)的完整性和一致性。

通过一个经典的数据库问题(丢失更新)就可以看到锁的意义:

1)针对同一个数据库,有表 Student,表结构如下: ID、姓名、年龄

2)用户A登录到数据库中,查询Student表的数据,此时标记A的会话为Session1

3)用户B登录到数据库中,查询Student表的数据,此时标记B的会话为session2

4)用户A将Student表中姓名为张三的学生姓名修改为李四,并提交

5)用户B将Student表中姓名为张三的学生的年龄修改为18,并提交

当B提交数据时,他看到的数据是最初提取出来的数据,并做出修改,此时数据库中会存在一条姓名为张三年龄为18的记录。但是在操作4中,用户A明明将张三的姓名修改为了李四,这样明显可以看出,用户A做的修改并没用生效,这种情况称之为丢失更新。虽然整个过程仅仅涉及了Select和Update简单的操作,但产生的问题是很明显的。为此,我们应该对数据共享进行一定的保护,也就引入了锁机制。

2.锁机制

悲观锁定

悲观锁定就如同他的名字一样,数据库“悲观”地认为并发情况下准备修改的数据随时有可能已经被他人修改。因此在用户获取某些数据并有意做出修改时,数据库就对这些数据加上锁,并一直将锁保持至用户提交或回滚当前事务,在此期间其他用户不能对这些数据或数据结构做出修改。正是因为悲观锁定的这种特性,用户必须要保持与数据库的有效的连接状态,而且至少在事务生存期中只有一个用户。一般来说悲观锁定对数据的一致性管理是较为有效的,但是其缺点也较为明显:当并发量较大时,很容易造成阻塞,同时在一些特定的应用环境下,如Web应用,因为很难保证事务生存期中只有一个用户,当多个用户进入这个连接,那么锁的作用就会失效。

乐观锁定

与悲观锁定不同,数据库“乐观”地认为并发情况下准备被修改的数据不会被他人修改,直到最后做提交修改时才加锁并验证数据是否正确。乐观锁定事务开始于最终提交修改,因此对连接的要求几乎没有。但是因为在事务开始前,有可能修改的数据已经被他人修改过,此时会回滚当前的事务,用户做的修改将会失败。采用乐观锁定的要求比悲观锁定要低很多,并且阻塞的时间也非常的短。但因为有可能事务被回退,就需要为此做其他的弥补措施。

阻塞

阻塞发生在用户之间对资源的控制权争夺中,如果一个用户A已经对某个数据持有了锁,另一个用户B又请求获取这个数据的控制权,那么就会产生阻塞。在此期间,用户B的操作会被搁置,

直到用户A提交或回滚当前事务,用户B才能获取到数据的控制权。

死锁

死锁同样发生在资源的控制权争夺中,但是与阻塞最大的区别是:

阻塞是由于资源不足引起的排队等待现象。  死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放。

下面通过一个简单的例子介绍死锁产生的一个原因:

1)数据库中存在A、B两表,且两表都只有一条数据

2)用户A进入数据库,此时标记A的会话为Session1

3)用户B进入数据库,此时标记B的会话为Session2

4)用户A修改A表的数据,用户B修改B表的数据

5)用户A再修改B表的数据,用户B再修改A表的数据

进行到操作5时,将产生死锁现象。用户A在等待用户B释放对A表数据的控制权,而用户B又在等待用户A释放对B表数据的控制权,这就引发了死锁的现象。

需要注意的是,Oracle数据库本身几乎不会发生死锁现象,一旦你的应用中出现了死锁的问题,那么一般是设计上存在Bug(如外键中没有创建索引等)。

(以上内容摘于网络,如有侵权,请告之,将第一时间删除)

oracle中锁机制,Oracle锁的基本机制相关推荐

  1. Oracle中for update造成锁表,致使无法删除或更新表内容

    在使用oracle中,想要修改数据库数据时 ,正常情况下查询出表内容后,无法对表进行修改,可以使用以下两种方法进行修改! 方法一 select t.*,t.rowid from CLAIM_USER ...

  2. oracle中rollback用法,Oracle中SAVEPOINT和ROLLBACK用法

    savepoint是事务内部允许部分rollback的标志符.因为事务中对记录做了修改,我们可以在事务中创建savepoint来标识不同的点.如果遇到错误,就可以rollback到不同的点或直接回来事 ...

  3. oracle中DBWR全称,Oracle基本术语大全

    Oracle基本术语大全 §2.4.2 重做日志工作模式Oracle可以在两种模式之一来工作: 1)ARCHIVELOG模式(可恢复) Oracle 一般至少有两个日志文件.它们轮流交替地被写入所作的 ...

  4. oracle中创建游标,oracle 存储过程创建游标

    Oracle与Sql Server差异点详解 1.create函数或存储过程异同点 Oracle 创建函数或存储过程一般是 create or replace -- SQL SERVER 则是在创建之 ...

  5. oracle中的checkpoint,Oracle checkpoint详解

    checkpoint扫盲 什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属于分散写,写日志文件是顺序写,因此为了保证数据库的性 ...

  6. 在Oracle中exception关键字,Oracle表字段有Oracle关键字出现异常解决方案

    一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因 ...

  7. oracle中各种函数,oracle中常用函数大全

    1.数值型常用函数 函数 返回值 样例 显示 ceil(n) 大于或等于数值n的最小整数 select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数 s ...

  8. oracle中判断空,Oracle中判断空游标的方法

    1.声明包 create or replace package TAL_TEST is -- Author : ADMINISTRATOR -- Created : 2012/12/9 15:15:3 ...

  9. oracle中正则表达式规则,Oracle中的正则表达式(及函数)详解

    1.概述 相信大家对正则表达式都不陌生,从linux下的命令到Java等编程语言,正则表达式无处不在,虽然我们实际使用的时候也并不一定太多,但是当我们要处理字符串时,它确实是一个强大的工具. 上一篇文 ...

  10. Oracle中限定日期,Oracle 日期的一些简单使用

    Oracle 日期的一些简单使用 更新时间:2009年08月04日 16:52:35   作者: 学习了这么长的数据库,突然意识到自己对于数据库主外键的意义完全弄不懂,是唯一标识一条记录,是为连接查询 ...

最新文章

  1. netsh命令修改ip
  2. AI算力需求6年增长30万倍,「超异构计算」才能满足下一个10年
  3. 机器学习Top10算法,教你选择最合适的那一个!
  4. Java NIO学习系列三:Selector
  5. 使用Java进行查询hugegraph_HugeGraph Examples
  6. java继承对象转换_java中类与对象的继承重写,存储以及自动转换和强制转换。...
  7. 【转载】架构师需要了解的Paxos原理、历程及实战
  8. 线性代数:System of Linear Equation学习笔记
  9. [转]centos7.2 下 nginx 开机启动
  10. SpringBoot与缓存使用及原理(下)
  11. Android P版本怎么简单的验证HIDL的Demo例程
  12. Cadence OrCAD Capture交叉参考报表生成方法图文教程
  13. Android各控件Demo下载地址
  14. 学信网如何通过证件编码查学历
  15. 今天16:00 | 中科院计算所研究员孙晓明老师带大家走进量子的世界
  16. [云原生]~云原生简介
  17. VMware vSphere的相关知识
  18. Ubuntu19,新体验,无法识别移动硬盘以及硬盘修复
  19. QTextEdit详解
  20. Mysql优化——唯一索引和普通索引的选择

热门文章

  1. 怎么关闭计算机安全,电脑中安全防护怎么关闭
  2. QT开发之老板无法拒绝的辞职信
  3. R语言-面板数据分析步骤及流程-
  4. github-production-release Git-2.28.0-64-bit
  5. pixi.js 5.0_使用Pixi.js进行高级绘图
  6. 可解释的人工智能 = 三维结构芯片 + 仿突触运动
  7. oracle使用dmp文件恢复,dmp文件恢复oracle数据库
  8. 《单片机原理及应用(魏洪磊)》第六章第11题
  9. 居民身份证号码的编码规则
  10. spark+dataframe+小汽车摇号倍率与中签率分析