Oracle锁表 行级锁 表级锁 行级锁

Oracle锁表  行级锁  表级锁   spa

        ---- 行被排他锁定  对象

        ----在某行的锁被释放以前,其余用户不能修改此行          ----使用 commit 或 rollback 命令释放锁  事务

        ----Oracle 经过使用 INSERT、UPDATE 和 SELECT…FOR UPDATE 语句自动获取行级锁  it

SELECT…FOR UPDATE 子句  ―在表的一行或多行上放置排他锁  ―用于防止其余用户更新该行  table

―能够执行除更新以外的其余操做  变量

―select * from goods where gid=1001  ―for update of gname;  兼容性

―只有该用户提交事务,其余用户才可以更新gname   扩展

FOR UPDATE WAIT 子句  ―Oracle9i 中的新增功能  ―防止无限期地等待锁定的行  ―等待间隔必须指定为数值文字  date

―等待间隔不能是表达式、赋值变量或 PL/SQL  变量  select

―select * from goods where gid=1001 for update of gname wait        3  ―等待用户释放更新锁的时间为3秒,不然超时。  •表级锁  

―保护表的数据  

―在多个用户同时访问数据时确保数据的完整性  ―能够设置为三种模式:共享、共享更新和 排他  

          语法:lock table <table_name>in <mode>;  共享锁  ―锁定表  

―仅容许其余用户执行查询操做  ―不能插入、更新和删除  

―多个用户能够同时在同一表中放置此锁  ―lock table table_name  ―in share mode [nowait];  

― rollback 和commit 命令释放锁  ― nowait 关键字告诉其余用户不用等待  共享更新锁  

―锁定要被更新的行  

―容许其余用户同时查询、插入、更新未被锁定的行  

―在 SELECT 语句中使用“FOR UPDATE”子句,能够强制使用共享更新锁  ―容许多个用户同时锁定表的不一样行

加锁的两种方法  

            lock table tab_name in share update mode;              select column1,column2              from goods              where goods              where gid=1001  

            for update of column1,column2  排他锁  

―与其余两种锁相比,排他锁是限制性最强的表锁  ―仅容许其余用户查询数据  

―不容许执行插入、删除和更新操做  

―在同一时间仅容许一位用户在表上放置排他锁  ―共享锁与此相反   

        lock table tab_name in exclusive mode;          lock table <表名>[ <表名>]...                    in share mode [nowait]     

        lock table < 表名>[ <表名>]...          in exclusive mode [nowait]          lock table <表名>[ <表名>]...          in share update mode[nowait]                       

-----------------------------------------------------------------------------------------------

LOCK      Name    

  LOCK   —   在事务中明确地锁定一个表        LOCK   [   TABLE   ]   name    

  LOCK   [   TABLE   ]   name   IN   [   ROW   |   ACCESS   ]   {   SHARE   |   EXCLUSIVE   }   MODE    

  LOCK   [   TABLE   ]   name   IN   SHARE   ROW   EXCLUSIVE   MODE          输入                

  name    

  要锁定的现存的表.           

  ACCESS   SHARE   MODE    

  注意:   这个锁模式对被查询的表自动生效。           

  这是最小限制的锁模式,只与   ACCESS   EXCLUSIVE   模式冲突。   它用于保护被查询的表免于被并行的   ALTER   TABLE,   DROP   TABLE   和   VACUUM   对同一表操做的语句修改。           

  ROW   SHARE   MODE    

  注意:   任何   SELECT...FOR   UPDATE   语句执行时自动生效。   由于它是一个共享锁,之后可能更新为   ROW   EXCLUSIVE   锁。           

  与   EXCLUSIVE   和   ACCESS   EXCLUSIVE   锁模式冲突。           

  ROW   EXCLUSIVE   MODE    

  注意:   任何   UPDATE,   DELETE和   INSERT   语句执行时自动生效。           

  与   SHARE,   SHARE   ROW   EXCLUSIVE,   EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式冲突。           

  SHARE   MODE    

  注意:   任何   CREATE   INDEX   语句执行时自动附加。   共享锁住整个表.           

  与   ROW   EXCLUSIVE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式冲突。这个模式防止一个表被并行更新。           

  SHARE   ROW   EXCLUSIVE   MODE    

  注意:   这个模式相似   EXCLUSIVE   MODE,可是容许其余事务的   SHARE   ROW   锁.           

-----------------------------------------------------------------------------------------------

  与   ROW   EXCLUSIVE,SHARE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式冲突。           

  EXCLUSIVE   MODE    

  注意:   这个模式一样比   SHARE   ROW   EXCLUSIVE   更有约束力.   它阻塞全部并行的   ROW   SHARE/SELECT...   FOR   UPDATE   查询。           

  与   ROW   EXCLUSIVE,SHARE,SHARE   ROW   EXCLUSIVE,EXCLUSIVE   和   ACCESS   EXCLUSIVE   模式冲突。           

  ACCESS   EXCLUSIVE   MODE    

  注意:   由语句   ALTER   TABLE,   DROP   TABLE,VACUUM   执行时自动生效。这是最严格的约束锁,它与全部其余的锁   模式冲突而且保护一个被锁定的表不被任何其余并行的操做更改。           

  注意:   一个不合格的   LOCK   TABLE   一样要求这个锁模式   (例如,一条没有显式锁模式选项的命令)。                

  输出                

  LOCK   TABLE        成功锁定后的返回.           

  ERROR   name:   Table   does   not   exist.        若是name   不存在,返回此信息.                

  描述      

  LOCK   TABLE   控制一次事务的生命期内对某表的并行访问.   Postgres   在可能的状况下尽量使用最小约束的锁模式。   LOCK   TABLE   在你须要时提供更有约束力的锁。           

  RDBMS   锁定使用下面术语:                

  EXCLUSIVE    

  排它锁,防止其余(事务)锁的产生.           

  SHARE    

  容许其余(事务)共享锁.避免   EXCLUSIVE   锁.           

  ACCESS    

-----------------------------------------------------------------------------------------------

  锁定表结构.           

  ROW    

  锁定独立的行.           

  注意:   若是没有声明   EXCLUSIVE   或   SHARE,假设为   EXCLUSIVE.锁存在于事务周期内.                

  例如,一个应用在   READ   COMMITED   隔离级别上运行事务,   而且它须要保证在表中的数据在事务的运行过程当中都存在。要实现这个你   能够在查询以前对表使用   SHARE   锁模式进行锁定。这样将保护数据不被   并行修改而且为任何更进一步的对表的读操做提供实际状态的数据,   由于   SHARE   锁模式与任何写操做须要的   ROW   EXCLUSIVE   模式冲突,而且你的   LOCK   TABLE   name   IN   SHARE   MODE   语句将等到全部并行的写操做提交或回卷后才执行。           

  注意:   当在   SERIALIZABLE   隔离级别运行事务,并且你须要读取真实状态的数据时,   你必须在执行任何   DML   语句   (这时事务定义什么样的并行修改对它本身是可见的)   以前运行一个   LOCK   TABLE   语句。                

  除了上面的要求外,若是一个事务准备修改一个表中的数据,   那么应该使用   SHARE   ROW   EXCLUSIVE   锁模式以免死锁状况(当两个   并行的事务试图以   SHARE   模式锁住表而后试图更改表中的数据时,   两个事务(隐含的)都须要   ROW   EXCLUSIVE   锁模式,而此模式与并行的   SHARE   锁冲突)。           

  继续上面的死锁(两个事务彼此等待)问题,   你应该遵循两个通用的规则以免死锁条件:                

  事务应该以相同的顺序对相同的对象请求锁。           

  例如,若是一个应用更新行   R1   而后更新行   R2(在同一的事务里),   那么第二个应用若是稍后要更新行   R1   时不该该更新行   R2(在   同一事务里)。相反,它应该与第一个应用以相同的顺序更新行   R1   和   R2。           

  事务请求两个互相冲突的锁模式的前提:其中一个锁模式是自冲突的   (也就是说,一次只能被一个事务持有)。   若是涉及多种锁模式,那么事务应该老是最早请求最严格的锁模式。           

  这个规则的例子在前面的关于用   SHARE   ROW   EXCLUSIVE   模式取代   SHARE   模式的讨论中已经给出了。         -----------------------------------------------------------------------------------------------

  注意:   Postgres   的确检测死锁,   并将回卷至少一个等待的事务以解决死锁。           

  注意      

  LOCK   是   Postgres   语言扩展.           

  除了ACCESS   SHARE/EXCLUSIVE   锁模式外,全部其余   Postgres   锁模式和   LOCK   TABLE   语句都与那些在   Oracle   里面的兼容。           

  LOCK   只在事务内部使用.           

  用法      

  演示在往一个外键表上插入时在有主键的表上使用   SHARE   的锁:           

  BEGIN   WORK;    

  LOCK   TABLE   films   IN   SHARE   MODE;      SELECT   id   FROM   films      

          WHERE   name   =   'Star   Wars:   Episode   I   -   The   Phantom   Menace';    

  --   若是记录没有返回则回卷    

  INSERT   INTO   films_user_comments   VALUES      

          (_id_,   'GREAT!   I   was   waiting   for   it   for   so   long!');      COMMIT   WORK;               

  在执行删除操做时对一个有主键的表进行   SHARE   ROW   EXCLUSIVE   锁:           

  BEGIN   WORK;    

  LOCK   TABLE   films   IN   SHARE   ROW   EXCLUSIVE   MODE;      DELETE   FROM   films_user_comments   WHERE   id   IN              (SELECT   id   FROM   films   WHERE   rating   <   5);      DELETE   FROM   films   WHERE   rating   <   5;      COMMIT   WORK;                 兼容性        SQL92      

  在SQL92里面没有LOCK   TABLE   ,可使用   SET   TRANSACTION   来声明当前事务的级别.   咱们也支持这个,参阅   SET   TRANSACTION   获取详细信息。