当前位置:数据库 > Oracle >>

Oracle中for update相关的语法

Oracle中for update相关的语法
 
纯粹的select语句:Oracle不会加任何锁,也就是Oracle对 select 读到的数据不会有任何限制。虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态。
 
select语句+for update:
Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,直到数据被修改结束(被commit),马上自动执行这个select语句。
如果该查询语句发出后,有人需要修改这批数据(中的一条或几条),它也必须等到查询结束后(commit)后,才能修改。
 
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。
select语句+ for  update NOWAIT:Oracle将要更改的数据试探性地加锁,当发现数据被别的session锁定中的时候,就会迅速返回错误ORA-00054: resource busy and acquire with NOWAIT specified。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中,如果锁定中的话,就要采取相应的业务措施进行处理。
 
select语句+ for  update WAIT n:同上。只是不是立即返回异常,而是在等待n秒之后仍不能获取到资源的话返回错误ORA-30006: resource busy; acquire with WAIT timeout expired。
select语句+SKIP LOCKED:不提示错误,而是直接返回no rows selected。
 
select语句+for update of columns:
用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of 后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。
在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,