锁定
在Oracle中,锁定又分为表锁定和行锁定。
(1)表锁定:对整个表实行数据锁定,以确保当前事务可以访问数据,防止其他的会话或事务同时对该表进行访问而造成冲突,用于保护整张表的数据。
(2)行锁定:又称记录锁定,对当前操作的一行进行锁定,锁定总是以独占的方式进行,在一个事务结束之前,其他事务将要等待该事务结束。
记录锁定:Oracle隐式的实现记录锁定,当执行 insert、delete及select for Update 语句时,将进行记录锁定。这种锁定又称为 互斥锁,或者排它锁(Exclusive Locks)。
当记录添加了这种锁之后,锁定总是以独占的方式进行,一个事务没有结束以前,其他的事务只能等待直到锁定释放。
表锁定:表锁定具有不同的模式,下面是常见的几种表锁定的模式。
(1)ROW SHARE : 行共享锁,在锁定表的同时允许别的事务并发地对表进行 select、insert、Update、delete及lock table操作,不允许任何事务对同一个表进行独占式的写访问。
(2)ROW EXCLUSIVE:行排它锁,当一个标的多行记录被更新时,也允许别的事务并发地对表进行 select、insert、Update、delete及lock table操作,与行共享锁不同的是它不能防止别的事务对同一个表的手工锁定或独占式读写。
(3)SHARE LOCK:共享锁,只允许别的事务查询或锁定特定的记录,防止任何事务对同一个表的插入、修改和删除操作。
(4)SHARE ROW EXCLUSIVE:共享排它锁,允许别的事务查看表中的记录,但不允许别的事务以共享模式锁定表或者更新表中的记录。
(5)EXCLUSIVE:排它锁,该事务以独占方式写一个表,允许别的用户读取和查询,但是不允许进行任何的 insert、Update、delete操作。
LOCK TABLE 语句允许用户使用一个特定的锁定模式锁定整个数据表。
语法:
LOCK TABLE table_list IN lock_mode MODE [NOWAIT];
其中 lock_mode是上述五种锁定模式中的一种,NOWAIT是可选项,当试图锁定一个表的时候,如果该表已被别的事务锁定,则立即将控制返还给事务,否则将一直等待下去,知道该表的锁定被解除。
LOCK TABLE emp_copy IN ROW SHARE MODE NOWAIT; LOCK TABLE emp_copy IN ROW EXCLUSIVE MODE NOWAIT; LOCK TABLE emp_copy IN SHARE LOCK MODE NOWAIT; LOCK TABLE emp_copy IN SHARE ROW EXCLUSIVE MODE NOWAIT; LOCK TABLE emp_copy IN EXCLUSIVE MODE NOWAIT;
如果要解除使用 LOCK TABLE语句的锁定,只需简单的使用 commit 或 rollback 语句即可。
使用lock table 还可以对视图进行锁定,当然锁定视图实际上是对视图所组成的基础表进行了锁定。