锁的概念
锁定是数据库用来控制共享资源并发布访问的机制。
在多个用户的情况下,利用锁定来保证数据的完整性和唯一性。
例如:当两个用户同时更改一行数据时,并没有commit,那么后修改的用户会产生自动锁。
首先使用第一个用户登录进行修改,并不commit
然后使用第二个用户进行登录修改
第二个用户进行修改以后,出现了自动锁,当第一个用户进行commit后,第二个用户就会解锁
按用户与系统划分,可以分为自动锁和显示锁
自动锁:
当进行对数据的操作时,默认情况下,系统会自动为此数据操作获取所有必要的锁定。
显示锁:
某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更好,显示锁是用户为数据库对象设定的。(求解)
按级别划分,可以分为共享锁和排他锁
共享锁:共享锁使一个事物对特定数据资源进行共享访问。也就是说,当多用户都连接这个资源,都会获得相同的共享锁。共享锁提高了事物的并发性,但设置不当容易造成数据更新丢失和死锁。
排他锁:设置排他锁之后,当用户事物操作会单独获得此资源,另一事物在此事物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
第二个用户可以进行测试,设置等待5秒
这里等待5秒后,现实资源正在被使用,避免无限的等待。
可以使用 lock table 表名 in 锁模式 mode nowait
使用nowait 可以防止 另外的用户在被锁定后不用无休止的等待。
共享锁(share,s)
共享锁将锁定表,仅允许其他用户查询表中的行,但不允许插入、更新或删除行。多个用户可以同时在同一个表
中放置共享锁,即允许资源共享,因此得名“共享锁”。例如,如果用户每天都需要在结帐时更新日销售表,则可以在更改该表时使
用共享锁以确保数据的一致性。也就是说该表只能查,其他用户想修改表中行的数据,只需要对该表进行共享锁。
排他锁(exclusive,e)
对表执行最大限制。除了允许其他用户查询该表的记录,排他锁防止其他事务对表做任何更改或在表上应用
任何类型的锁。这个锁应该叫锁中之王,他锁住了的话,其他用户就只有查询的功能了,就别想在该表中干别的事了。
共享行排他(SHARE ROW EXCLUSIVE , SPX):执行比共享表更多的限制。防止其他事务在表上应用共享锁、共享行排他锁以及排他锁
。共享行排他是除了该行以外的其他行也不能增、删、改。只能在此表中加低级表。要是想在该表中更改其他行的数据,就只有其他
用户对该行进行共享行排他锁,也仅仅只能修改被这个用户锁定的行,而其他的行也修改不了。
本文转自 郑伟 51CTO博客,原文链接:http://blog.51cto.com/zhengweiit/517554