Select...for update 语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所妨碍。

借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作。

加锁范围子句:

在select ....for update 之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁。

// 采用默认格式for update------select * from emp where  rownum<2 for udpate;

此时,我们观察v$lock和v$locked_object视图,可以看到锁信息。

// 事务信息视图-------select addr ,xidusn,xidslot,sdsqn from v$transaction;

//锁对象信息

SQL> select xidusn,xidslot,xidsqn,object_id,session_id, oracle_username from v$locked_object;


从上面的情况看,默认情况下的for update语句,效果相当于启动了一个会话级别的事务,在对应的数据表(select所涉及的所有数据表)上加入一个数据表级共享锁(TMlmode=3)。同时,在对应的数据行中加入独占锁(TXlmode=6)。


根据我们以前的知识,如果此时有另一个会话视图获取对应数据行的独占权限(无论是用update/delete还是另一个for update)ÿ