ORACLE锁的类型
在正常状况下,ORACLE会自动锁住须要加锁的资源以保护数据, 这种锁是隐含的,叫隐含锁。然而,在一些条件下,这些自动的锁在 实际应用时并不能知足须要,必须人工加一些锁。这些人工加的锁叫显示锁。
下面指明了会产生隐含锁的SQL语句:
INSERT;
UPDATE;
DELETE;
DDL/DCL语句。
下面指明了会产生显示锁的SQL语句: sql
SELECT FOR UPDATE; LOCK TABLE IN XXX MODE。
在同时对表进行以上操做的时候,就有可能会产生锁 减小并发事务处理吧,处理完成以后尽快commit吧服务器
LOCK TABLE 使用:
说明 并发
此语句用于防止其它并发事务访问或修改表。code
语法 事务
LOCK TABLE table-name
[ WITH HOLD ]
IN { SHARE | EXCLUSIVE } MODE资源
参数 it
table-name 表必须是基表,而不是视图。由于临时表数据是当前链接的本地数据,因此锁定全局临时表或局部临时表都无效。table
WITH HOLD 子句 若是指定该子句,锁一直保持到链接结束时。若是没有指定该子句,则提交或回退当前事务时将释放锁。class
SHARE 模式 禁止其它事务修改表,但容许它们读取表。在该模式下,只要没有其它的事务锁定所修改的行,就能够间接地或显式地使用 LOCK TABLE 更改表中的数据。权限
EXCLUSIVE 模式 禁止其它事务访问表。任何其它事务都不能对表执行查询、任何更新或任何其它操做。若是用 LOCK TABLE t IN EXCLUSIVE MODE 排它性地锁定表 t,则服务器的缺省行为是不获取 t 的行锁定。将 SUBSUME_ROW_LOCKS 选项设置为 OFF 能够禁用此行为。
用法
LOCK TABLE 语句容许直接控制表级并发,与当前的隔离级别无关。虽然事务的隔离级别一般控制当前事务执行请求时设置的锁的种类,但 LOCK TABLE 语句容许更显式地控制表行的锁定。
LOCK TABLE 以 SHARE 模式放置的锁为幻像和防幻像锁,sa_locks 过程将它们显示为 PT 和 AT。
权限
若要以 SHARE 模式锁定表,须要 SELECT 权限。
若要以 EXCLUSIVE 模式锁定表,必须是表全部者或者有 DBA 权限。
反作用
须要访问锁定表的其它事务可能被延迟或阻塞。
示例
下面的语句禁止其它事务在当前事务期间修改 customer 表:
LOCK TABLE customer IN SHARE MODE