Oracle锁的分类
1、按用户与系统划分
(1)自动锁:当进行一项数据操作时,默认情况下,系统自动为此数据库操作获得所有有必要的锁。自动锁又分为DML锁、DDL锁、内部锁和闩(shuan)。(2)显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,使数据库操作执行得更好。显示锁是用户为数据库对象设定的。
提示:内部锁和闩:一种资源,如果可能发生多个进程同时访问的情况,造成资源的破坏,那么就需要给这种资源上一个锁,如果这种资源很简单,如就是内存的分配和释放,那么就是用内部锁和闩。
2、按锁级别划分
(1)排他锁(Exclusive Lock,X锁):事务设置排他锁后,该事务单独获得此资源,另一事务不能在此事务提交之前获得相同对象的共享锁或排他锁。(2)共享锁(Share Lock,S锁):共享锁使一个事务对特定数据库资源进行共享访问,另一事务也可对此资源进行访问或获得相同共享锁。
3、按操作划分
(1)DML锁(Data Lock,数据锁):用于控制并发事务中的数据操纵,保证数据的一致性和完整性。(2)DDL锁(Data Dictionary Locak,数据字典锁):用于保护数据库对象的结构,如表、索引等的结构定义,DDL语句自动上DDL锁。
(3)内部锁和闩(Internal Lock and Latch):由Oracle管理,用来保护数据库内部数据结构。
DML锁
1、TM锁(表级锁)
当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其他事务通过DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排他锁,只有当事务显示使用LOCK TABLE语句定义一个排他锁时,事务才会获得表上的排他锁,也可使用LOCK TABLE显示定义一个表级的共享锁。锁定表的语法:
LOCK TABLE <table_name> IN <lock_mode> MODE [NOWAIT];
lock_mode是锁定的模式
表级锁的模式包括以下内容。
1)共享锁方式(Share)
共享锁即共享方式的表级锁,是对表中的所有数据进行加锁。该锁用于保护查询数据的一致性,防止其他用户对已加锁的表进行更新。其他用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁,共享更新锁可以再施加,但不允许持有共享更新锁的进程更新。共享该表的所有用户只能查询表中的数据,但不能更新。
LOCK TABLE <表名>[,<表名>]... IN SHARE MODE [NOWAIT]
2)独占锁方式(Exclusive)
独占锁即独占方式表级锁,是用于加锁表中的所有数据。拥有该独占表级锁的用户,既可以查询该表,又可以更新该表,其他的用户不能再对该表施加任何锁(包括共享、独占或共享更新锁)。其他用户虽然不能更新该表,但可以查询该表。
独占方式的表级锁可通过如下的SQL语句来显式地获得:
LOCK TABLE <表名>[,<表名>]... IN EXCLUSIVE MODE [NOWAIT]
独占方式的表级锁也可以在用户执行DML语句INSERT、UPDATE、DELETE时隐含获得。
3)共享更新锁(Share Update)
共享更新锁是对一个表的一行或多行进行加锁,因而也称做行级锁。表级锁虽然保证了数据的一致性,但却减弱了操作数据的并行性。行级锁确保在用户取得被更新的行到该行进行更新这段时间内不被其他用户所修改。因而行级锁既可以保证数据的一致性,又可提高数据操作的并行性。
可通过如下的两种方式来获得行级锁。
(1)执行如下的SQL封锁语句,以显示的方式获得:
LOCK TABLE <表名>[,<表名>]... IN SHARE UPDATE MODE [NOWAIT]
(2)用如下的SELECT...FOR UPDATE语句获得:
SELECT <列名>[,<列名>]... FROM <表名> WHERE <条件> FOR UPDATE OF <列名>[,<列名>]... [NOWAIT]
2、TX锁(事务锁或行级锁)
当事务执行数据库的插入、更新、删除操作时,该事务自动获得操作表中操作行的排他锁。行级锁的模式包括以下内容:
(1)INSERT、UPDATE、DELETE隐式加行级锁(排他)。
(2)SELECT...FOR UPDATE显式加行级锁(共享)。
TX锁用于显式锁定将要更新的数据行,防止其他用户在更新之前操作此行。
例如:
SELECT * FROM emp WHERE deptno = 30 FOR UPDATE;
UPDATE emp SET ename='Tom' WHERE empno = 7499;--30号部门员工