热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle锁机制原理(深入剖析)

Oracle锁机制原理(深入剖析)库用两种类型的锁,一种是共享锁,另一种是排他锁。在像表或是表中一行只能获得一个排他锁,但是共享锁可以再单个的资源中被多次获得。锁影响读和写相互作用。下面的一些规则综述了...SyntaxHighlighter.all();
Oracle锁机制原理(深入剖析)
 
库用两种类型的锁,一种是共享锁,另一种是排他锁。在像表或是表中一行只能获得一个排他锁,但是共享锁可以再单个的资源中被多次获得。
锁影响读和写相互作用。下面的一些规则综述了oracle数据库关于读和写的一些行为:
  1)仅当被写操作编辑时一行记录会被锁定
当一条更新的命令更新一行是,这个事务就会只获得这一行的锁。通过锁定在表中的这一条数据层次面,这个数据库会很小的争夺对这个共享数据来说。正常情况下,数据库不会逐渐升级为对这个块的行锁或是到一个表锁的等级。
  2)只能在同一时间对一个数据块进行写入:
如果一个事务编辑表中的一行记录,那么这个行锁就会阻止其他事务同时对同一行的元组进行编辑。
  3)读永远不会妨碍写
因为读一行数据不会进行对它枷锁,另一个事务可以同时对同一行进行编辑。这个当然除了select 。。。from update这个语句之外,这个select是一个很特别的语句不会在它读的时候锁住一行数据。
  4)写的时候不影响读
当一行数据被写入改变的时候,这个数据库会使用undo date去提供读取一致的行数据。
三)锁的使用
在一个单用户数据库中,锁就不需要了因为只有一个用户去编辑信息。然而,当多用户去访问和编辑数据时,这个数据库必须提供一种方式去阻止去并发的编辑相同的数据。锁机制达到下面非常重要的数据库的一些要求:
  1)一致性
 一个数据的session必须可见和改变数据但是不能被其他的session进行改变数据直到这个用户完成了操作。
  2)完整性
在正确修改序列时这个数据和数据结构必须反映所有操作的改变
在事务通过它们锁机制中oracle数据库提供了数据的并发性、一致性、完整性。锁是自动执行的不需要用户操作。
 当并发更新一行的时候,会说明需要什么要的锁。在下面的例子中,一个简单的web应用显示最终用户的雇员邮箱和电话号码。这个应用使用update语句像下面这样编辑数据:
 
[sql]
eg:  
update employees  
set email=? ,phone_number=?  
where employee_id=?  
and email=?  
and phone_number=?  

 

 
在update语句执行前,这个邮箱和电话号码值都是where字句之前的,没有对指定employee编辑之前的值。这个update确保这行记录在被应用最后读和显示给用户不会改变。通过这个方式,这个应用避免失去update数据的问题,当一个用户查看时却别其他用户编辑了.(也就是说不会出现脏读的情况)。
 
当执行sql语句的时候oracle数据库会自动获得所需要的锁。例如,当一个数据库允许一个会话去编辑一个数据,这个会话必须首先锁定这个数据。这个锁能够给这个session排斥其他的事务对这个数据进行锁定并修改,直到这个锁被释放掉。
因为这个锁的机制,数据库被事务控制联系紧密,应用开发者都会需要定义一些事务的特性,然后数据库会自动的管理锁机制。用户从来不需要锁定许多明确的资源,当然了oracle数据库也允许用户手动去锁定一些资源。
四)锁的模式
oracle数据自动使用最底的锁应用等级限制去最大程度上提供更高的并发性和数据的性。限制越低,就能更好的提供数据被其他用户所访问。相反越高的限制等级就会限制其他用户事务获取他们所需要的数据。
oracle数据库在多用户数据库中使用两中类型的锁(数据库可以使用startup restrict命令启动到一个特权模式下,在该模式下只用特定权限的用户才可以访问数据库)
  1)排他锁模式
 在这种模式下阻止数据被共享。当一个事务编辑数据的时候就会获得一个排他锁。第一个事务锁定了一个这个数据,那么只有他可以进行修改,其他用户如需在修改这个数据,那么必须等第一个事务修改完成释放了排他锁。
  2)共享锁模式
这个模式基于操作有关信息允许这个资源被共享。多个用户读取数据的时候会共享这个数据,持有共享锁去一个需要获得排他锁的用户并发访问。几个事务能够在相同的数据资源中取得共享锁。
假设一个事务使用select 。。。for update 语句去选择单表的一行。那么这个事务会获得一个行级共享排他锁。这个行锁允许其他的会话修改一些其他行,在这个表锁定的时候阻止会话去修改这个数据的结构。因此数据库提供了很多语句去执行。 
 
 五)锁的转化和升级
当必要时,oracle会执行锁的转化操作。在锁的转化中,oracle会自动的转换一个表锁从较低的限制到一个较高的限制。
例如。假设一个事务对employee表执行一个select 。。。for update然后更新锁住的行。在这种情况下数据库会自动转换从一个表的行级共享锁到一个表的行级排他锁。在这个事务中这个事务获得行级排他锁来完成所有数据行的插入、更新或是删除操作。因为行锁获取的是最高的约束程度,因此没有其他锁的转化被获得或是去执行。
锁的转化与锁的升级是不同的,锁的转化在许多锁从一个很低的粒度到一个很高的粒度重现。如果一个用户在一个表中锁定了很多的行,然后一下数据库自动的升级这个行锁到一个这个行所属表锁。那么锁的数量会变小,但是约束的程度会增大。
oracle数据库从来都不会升级锁。锁的升级很大程度上会发生思锁。建设一个系统试着为了事务1升级锁是不可行的因为这个锁被事务2持有了。这时当事务2也请求同意个数据被升级一个锁的时候死锁就产生了。
六)锁的持续
当像一个事务不在需要这个资源这种事件发生的时候,oracle数据库会自动的释放锁。在大多数情况下,在事务持续期间oracle数据库会通过事务的语句持有相应的锁。这些锁阻止并发事务的相互干啥,如可能产生的脏读、不可重复读、和幻想读情况。
 

推荐阅读
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
LC--Vincent
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有