iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle锁总结
  • 579
分享到

Oracle锁总结

2024-04-02 19:04:59 579人浏览 八月长安
摘要

《oracle的锁》在数据库中必须要了解的几点:1、事务是数据库的核心,他们是好东西2、应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力,这是因为,即使事务很长或很大,也一般不会对系统造成压力

oracle

数据库中必须要了解的几点:

1、事务数据库的核心,他们是好东西

2、应该延迟到适当的时刻才提交。不要太快提交,以避免对系统带来压力,这是因为,即使事务很长或很大,也一般不会对系统造成压力。相应的原则是:    在必要时才提交,不要提前。事务的大小只应该根据业务逻辑来定。

3、只要需要,就应该尽可能长时间的保持对数据所加的锁。这些锁是你能用的工具,而不是让你退避三舍,锁并不是什么稀有资源,恰恰相反,只要需要,    你就应该长期的保持数据上的锁。锁并不稀少,而且他们可以防止其他会话修改信息;

4、在Oracle中,行级锁 没有相关的开销,一点都没有。不论有一个行锁,还是有10000个行锁,专用于锁定这个信息的资源数都是一样的。当然,与修改一    行相比,修改10000行要做的工作肯定多得多,但是锁住10000行所需的资源数与锁住一行所需的资源数完全相同,这是一个固定的常量;

5、不要以为锁升级会对系统更好(例如:使用表锁而不是行锁)。在Oracle中,锁升级对系统没有任何好处,也不会节省任何资源。有时候我们会使用表     锁,例如在批处理中,使用表锁是为了确保在这种情况下你能访问你的批处理程序所需的所有资源;

6、可以同时得到并发性和一致性。数据读取器不会被数据写入器阻塞。数据写入器也不会被数据读取器阻塞。这是Oracle与大多数其他关系数据库之间的根    本区别之一;


一、Oracle锁的种类:

1.1、悲观锁:

    这种方式在用户修改数值之前就已经生效了,例如:用户打算对他选择的且在屏幕上可见的某个特定行执行更新(比如通过点击某个按钮),该行就会被加上一个锁,这个行锁会一直持续应用到应用程序在数据库中执行用户的修改并提交的时候;

注意:悲观锁仅适用于有状态或有连接的环境。也就是说你的应用与数据库直接有一个持续的连接,而且只有你一个人在使用这条连接(至少是在你的事务的生命周期内);


1.2、乐观锁:

    即把所有锁定的动作都延迟到即将执行更新之前才进行,换句话说,我们会修改屏幕上的信息而不需要先锁住他,;(这种锁方法在所有环境下都可以,但是采用这种方法,更新失败的可能性就会加大)也就说,用户要更新他的数据行时,却发现数据已经被修改过,那他就必须从头再来;


①:使用版本列的乐观锁

   这个方法很容易实现,如果你想保护数据库表不出现丢失更新问题,就在对应的每个表上增加一列,这一列一般是number  或  date/timestamp类型的列,通常通过表上的一个行触发器来维护。(最佳的方式是通过update语句本身来维护)

   

②:使用总和检验的乐观锁

   这版本列方法很相似,不过他是基于数据本身来计算得出一个“虚拟”的版本列,为了帮助解释有关总和检验或散列函数的目标和概念;

   

注意:对大多数应用来说,都建议采用乐观并发控制,而在乐观并发控制的方法中,更倾向于使用版本列方法,来增加一个时间戳列(而不只是一个number)


2、阻塞:

  数据中有5个常见的DML语句可能会引起阻塞,他们是:insert   update   delete  merge  和  select  for  update;

  对于一个阻塞的seelct  for  update 解决方案:只需要增加nowait字句,他就不会阻塞了;


2.1、阻塞的insert

insert阻塞的情况不多见,最常见的的情况是:你有一个带主键的表,或者表上有唯一性约束,单有两个回话试图用同样的值插入一行,如果这样,其中就有一个会话就会被阻塞;

注意:发生insert阻塞通常是因为应用允许最终用户生成主键/唯一列值。为了避免这种情况,最容易的做法就是使用一个序列或sys_guid()内置函数来生成主键/唯一列值;


2.2、阻塞的merge update delete

在一个交互式应用中,可以从数据库查询数据,允许最终用户处理这些数据,再把它放回到数据库中,此时如果发生update或delete阻塞,就说明你的代码中可能存在一个丢失更新问题;可以通过使用select  for  update  nowait查询来避免这个问题。这个查询能做到:验证自从你查询数据之后数据未被修改(防止丢失更新);锁住行(防止update或delete被阻塞)

不论是悲观锁还是乐观锁都可以利用select for update nowait查询来验证行未被修改。悲观锁会在用户有意修改数据那一刻使用这条语句。乐观锁则在即将在数据库中更新数据时使用这条语句。这样不仅能解决应用中的阻塞问题,还可以修正数据完整性问题;

注意:merge本质上其实就是insert 和 update


3、死锁

导致死锁的重要原因就是:外键未加索引,第二个原因是表上的位图索引遭到并发更新


4、Oracle的锁类型

Oracle主要有3种类型的锁:

4.1、DML锁:DML数据操纵语言,一般是指:select  insert  update  merge  delete

   DML锁机制允许并发执行数据修改,例如:DML锁可能是特定数据行上的锁,或者是锁定表中所有行的表级锁;

   

4.2、DDL锁:DDL数据定义语言,一般是指:create  alter语句

   DDL锁可以保护对象结构定义

   

注意:内部锁和闩:Oracle使用这些锁来保护其内部数据结构。(闩是Oracle采用的一种轻量级的低级串行化设备,功能上类似于锁)其实,闩是数据库中导致竞争的一个常见的原因;


5、DML锁:用于确保一次只有一个人能修改某一行,而且这时别人不能删除这个表;

①:TX锁----事务锁

  事务的发动是自动的,TX锁会被一直持有,直至事务执行提交(commit)或回滚(rollback)。TX锁被用作一种排队机制,使得其他回话可以等待这个事务完成;


②:TM锁----

  TM锁用于确保在修改表的内容时,表的结构不会改变。例如:如果你已经更新了一个表中的行,那同时也会得到这个表的一个TM锁,这会防止另一个用户在该表上执行DROP或ALTER命令;

  (在Oracle11G R2及更高的版本中,可以设置ddl_lock_timeout当DDL等待)


6、DDL锁:在DDL操作中会自动为对象加锁,从而保护这些对象不会被其他会话所修改;

   例如,如果我执行一个DDL操作alter table t,通常表T上就会有一个排他DDL锁,以防止其他会话得到这个表的DDL锁和TM锁;


有3钟类型的DDL锁:

①:排他DDL锁:

   这会防止其他会话得到它们自己的DDL锁或TM(DML)锁,这说明,在DDL操作期间可以查询一个表,但是无法以任何方式修改这个表;


②:共享DDL锁:

  这些锁会保护锁引用的对象的结构,使之不会被其他会话修改,但是允许修改数据;


③:可中断解析锁:

  这些锁允许一个对象(如共享池中缓存的一个查询计划)向其他对象注册其依赖性。     


7、闩:闩是轻量级的串行设备,用于协调对共享数据结构、对象和文件的多用户访问;(闩是一种轻量级的锁)



8、互斥锁:是一种与闩非常类似的串行化设备,互斥锁是数据库中使用另一种串行化设备;


查看锁定的对象、用户名和会话

sql> select lo.oracle_username,do.object_name,s.loGon_time,lo.process,s.sid as session_id from v$locked_object lo,v$session s,dba_objects do where lo.session_id = s.sid and do.object_id = lo.OBJECT_ID;



Oracle的Select For Update语句可以实现在读取数据后马上锁定相关资源,防止被其他session修改数据的目的


手动锁定:select ... for update语句

select * from table_sfu where a = 1 for update;  ----锁定第一行数据(只有commit后才会解锁)


您可能感兴趣的文档:

--结束END--

本文标题: Oracle锁总结

本文链接: https://www.lsjlt.com/news/43898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ReentrantReadWriteLock 读写锁分析总结
    目录一、读写锁简介二、读写锁使用ReadWriteLock 接口使用例子三、锁的降级锁降级的使用示例四、ReentranReadWriteLock 结构方法结构设计读写状态设计五、源...
    99+
    2024-04-02
  • oracle索引总结
    目录一、简介二、索引原理三、索引使用(创建、修改、删除、查看)1.创建索引语法2.修改索引3.重建索引3.删除索引4.查看索引四、索引分类1. B树索引2. 位图索引3.单列索引和复...
    99+
    2024-04-02
  • java锁synchronized面试常问总结
    目录synchronized都问啥?synchronized是什么?synchronized锁什么?synchronized怎么用?结语synchronized都问啥? 如果Jav...
    99+
    2022-12-08
    java synchronized面试 java synchronized锁
  • ORACLE sid,pid,spid总结
    概念上:1.spid (system process id)  是操作系统层面的进程id .2.pid(process id)  这个是基于oracle的进程id个人理解为就是oracle给自己的进程...
    99+
    2023-06-06
  • Java与Mysql锁相关知识总结
    目录锁的定义锁的实现JVM中的锁synchronizedReentrantLockMysql 锁共享锁(S) 与排它锁(X)作用范围意向锁作用范围记录锁间隙锁Next-Key Loc...
    99+
    2023-05-16
    Java与MySQL中的锁 Java中使用Mysql数据库实现锁 java mysql锁实现
  • Oracle 11gASM新特性总结
    一.  ASM 快速镜像再同步(ASMFast Mirror Resync) 1.1 无ASM快速镜像再同步时 每当ASM 无法向分配给某个磁盘的区执行写入操作时,就会使该磁盘脱...
    99+
    2024-04-02
  • oracle的exists用法总结
    Oracle的EXISTS用于检查子查询是否返回任何行。它返回一个布尔值,如果子查询返回至少一行,则为true,否则为false。 ...
    99+
    2024-04-09
    oracle
  • ReentrantReadWriteLock不能锁升级的原因总结
    为什么ReentrantReadWriteLock不能锁升级 在ReentrantReadWriteLock中,锁是不可以升级的,只能降级。 也就是如果当前线程持有了ReadLock...
    99+
    2024-04-02
  • MySQL事务与锁的知识点总结
    这篇文章主要介绍“MySQL事务与锁的知识点总结”,在日常操作中,相信很多人在MySQL事务与锁的知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL事务与锁的...
    99+
    2024-04-02
  • 关于Java锁性能提高(锁升级)机制的总结
    目录Java锁性能提高机制锁偏向轻量级锁自旋锁重量级锁Java锁升级简述对象头结构synchronized关键字monitor锁的四种状态Java锁性能提高机制 锁的使用很难避免,如...
    99+
    2024-04-02
  • 分享ORACLE SEQUENCE跳号总结
    在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢...
    99+
    2024-04-02
  • Java同步锁synchronized用法的最全总结
    目录一、并发同步问题二、锁的简介三、synchronized的三种应用方式1.修饰一个实例方法2.修饰一个静态方法3.修饰一个代码块(2)锁对象为类的Class对象四、synchro...
    99+
    2023-03-21
    Java同步锁 synchronized的总结
  • Oracle基础知识点总结
    这篇文章主要讲解了“Oracle基础知识点总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle基础知识点总结”吧!首先上一张Oracle体系结构图...
    99+
    2024-04-02
  • Oracle中PL/SQL的用法总结
    目录一、PLSQL基本结构1、基本数据类型变量1. 基本数据类型2. 基本数据类型变量的定义方法2、表达式1. 数值表达式2. 字符表达式3. 关系表达式4. 逻辑表达式3、PLSQ...
    99+
    2024-04-02
  • Oracle SQL注入的实例总结
    目录0x00 Oracle基础Oracle 基本使用什么是Oracle数据库?Oracle数据库的特点相比于其他数据库 Oracle的优缺点登录Oracle数据库O...
    99+
    2024-04-02
  • Java基础之线程锁相关知识总结
    一、 synchronized关键字 1.对象锁 a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正在访问对象锁内部的代码的时候,其他线程无法访问。(注意无法访问的范围)。 ...
    99+
    2024-04-02
  • Oracle 数据库12c新特性总结
    本篇内容介绍了“Oracle 数据库12c新特性总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1....
    99+
    2024-04-02
  • oracle中add_months()函数及用法总结
    今天对add_months函数进行简单总结一下: add_months 函数主要是对日期函数进行操作,在数据查询的过程中进行日期的按月增加,其形式为: add_months(date,int);其中第一个参...
    99+
    2024-04-02
  • Oracle中查询表结构的6种方法总结
    目录方法一:方法二:方法三:方法四:方法五:方法六:总结 方法一: 在【命令窗口】下输入,语法:desc 表名 DESC DUAL; --或 DESCRIBE TB_STUDENT; 注:可以使用PLSQL D...
    99+
    2023-04-12
    oracle查询表结构 oracle 表结构 oracle显示表结构语句
  • ORACLE临时表空间的总结分析
    ORACLE临时表空间的总结分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。临时表空间概念临时表空间用来管理数据库排序操作以...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作