Oracle PL/SQL开发基础(第二十八弹:使用锁定)

时间:2021-07-30 11:39:34

记录锁定

Oracle隐式地实现记录锁定。当执行INSERT、DELETE、SELECT FOR UPDATE时,将进行记录锁定。这种锁定又称为互斥锁,或者也称为排他锁(Exclusive Locks)。当记录添加了这种锁之后,锁定总是以独占的方式进行,一个事务没有结束以前,其他的事务只有等待知道锁定释放。

表锁定

Oracle默认并不会进行表锁定。
下面是最常见的几种表的锁定的模式:
- ROW SHARE:行共享锁,这是一种最小限制的锁定,在锁定表的同时允许别的事务并发地对表进行SELECT、INSERT、UPDATE、DELETE及LOCK TABLE操作,它不允许任何事务对同一个表进行独占式的写访问。
- ROW EXCLUSIVE:行排他锁,当一个表的多条记录被更新时,也允许别的事务对同一个表执行SELECT、INSERT、UPDATE、DELETE及LOCK TABLE操作,但是与行共享锁不同的是它不能防止别的事务对同一个表的手工锁定或独占式的读和写。
- SHARE LOCK:共享锁,只允许别的事务查询或锁定特定的记录,防止任何事务对同一个表的插入修改和删除操作。
- SHARE ROW EXCLUSIVE:共享排他锁,用于查看整个表,也允许别的事务查看表中的记录,但不允许别的事务以共享模式锁定表或更新表中的记录,这种锁定一般只允许用于SELECT FOR UPDATE语句中。
- EXCLUSIVE:排他锁,该事务以独占方式写一个表,允许别的用户读取和查询,但是不允许进行任何的插入修改和删除。

如果没有显式地指定锁定,Oracle在运行时会自动地提供隐式的锁定,因此一般情况下不需要对锁进行精细的控制,只有在有特殊需要时,才可能需要手工控制锁定的级别。

使用LOCK TABLE

LOCK TABLE可以使用一个特定的锁定模式锁定整个数据表。
语法为:

LOCK TABLE tale_reference_list IN lock_mode MODE [NOWAIT];

使用如下:

LOCK TABLE emp IN SHARE MODE;
LOCK TABLE emp IN EXCLUSIVE MODE NOWAIT;
LOCK TABLE emp IN SHARE UPDATE MODE;
LOCK TABLE emp IN ROW EXCLUSIVE MODE NOWAIT;
LOCK TABLE emp IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE emp IN ROW SHARE MODE NOWATI;

如果要接触使用LOCK TABLE的锁定,只需要简单的使用COMMIT或ROLLBACK即可。

LOCK TABLE还可以对视图锁定,锁定视图实际上就是对视图所组成的基础表进行了锁定。比如view_emp_dept视图由emp表和dept表组成,那么锁定视图实际上是对emp和dept这两个表的锁定。
例如下面的语句:

LOCK TABLE view_emp_dept IN SHARE MODE NOWAIT;

实际上等价于:

LOCK TABLE emp,dept IN SHARE MODE NOWAIT;