且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

oracle 锁的概念

更新时间:2022-09-24 23:21:46

锁的概念

锁定是数据库用来控制共享资源并发布访问的机制。

在多个用户的情况下,利用锁定来保证数据的完整性和唯一性。

例如:当两个用户同时更改一行数据时,并没有commit,那么后修改的用户会产生自动锁。

首先使用第一个用户登录进行修改,并不commit

oracle 锁的概念

然后使用第二个用户进行登录修改

oracle 锁的概念

第二个用户进行修改以后,出现了自动锁,当第一个用户进行commit后,第二个用户就会解锁

oracle 锁的概念 oracle 锁的概念

按用户与系统划分,可以分为自动锁和显示锁

自动锁:

当进行对数据的操作时,默认情况下,系统会自动为此数据操作获取所有必要的锁定。

显示锁:

某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。(求解)

按级别划分,可以分为共享锁和排他锁

共享锁:共享锁使一个事物对特定数据资源进行共享访问。也就是说,当多用户都连接这个资源,都会获得相同的共享锁。共享锁提高了事物的并发性,但设置不当容易造成数据更新丢失和死锁。

排他锁:设置排他锁之后,当用户事物操作会单独获得此资源,另一事物在此事物commit之前是不会获得相应的排他锁,或者共享锁。

 

按操作分,分为DML锁,DDL锁

DML 锁分为 表锁,行锁,死锁

行锁:当事物进行 insert update delete 时,会自动获得必要的排他锁(行锁属于排他锁)

表锁:当事物获得行锁后,也会得到相应的表锁(共享锁),以防止其他事物进行DDL语句影响记录的更新。

死锁:当两个事物需要一组有冲突的锁,而不能将事物继续下去,就会出现死锁。

DDL锁分为  共享DDL锁,排他DDL锁,分析锁

排他DDL锁:与排他锁的概念相同,只不过是进行DDL语句时获得必要的排他锁。

共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。

分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特

的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在

引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。 
 

内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存

写入信息。

 

如何避免同时使用资源而被锁定

语法:

select * from 表名 where条件表达式 for update [of column_list][wait n][nowait];

of  参数:指定即将更新的列

wait 设置等待时间

nowait 不等待

优点:

防止无限期的等待被锁定的行

对锁定时间的控制

例如:

第一个用正在更新,并没有commit

oracle 锁的概念

第二个用户可以进行测试,设置等待5秒

oracle 锁的概念

这里等待5秒后,现实资源正在被使用,避免无限的等待。

可以使用 lock table 表名 in 锁模式 mode nowait

使用nowait 可以防止 另外的用户在被锁定后不用无休止的等待。

共享锁(share,s)

共享锁将锁定表,仅允许其他用户查询表中的行,但不允许插入、更新或删除行。多个用户可以同时在同一个表

中放置共享锁,即允许资源共享,因此得名“共享锁”。例如,如果用户每天都需要在结帐时更新日销售表,则可以在更改该表时使

用共享锁以确保数据的一致性。也就是说该表只能查,其他用户想修改表中行的数据,只需要对该表进行共享锁。

排他锁(exclusive,e)

对表执行最大限制。除了允许其他用户查询该表的记录,排他锁防止其他事务对表做任何更改或在表上应用

任何类型的锁。这个锁应该叫锁中之王,他锁住了的话,其他用户就只有查询的功能了,就别想在该表中干别的事了。

共享行排他(SHARE ROW EXCLUSIVE , SPX):执行比共享表更多的限制。防止其他事务在表上应用共享锁、共享行排他锁以及排他锁

。共享行排他是除了该行以外的其他行也不能增、删、改。只能在此表中加低级表。要是想在该表中更改其他行的数据,就只有其他

用户对该行进行共享行排他锁,也仅仅只能修改被这个用户锁定的行,而其他的行也修改不了。


本文转自 郑伟  51CTO博客,原文链接:http://blog.51cto.com/zhengweiit/517554