zoukankan      html  css  js  c++  java
  • select for update nowait 与 select for update 区别 [z]

    http://blog.163.com/yiyun_8/blog/static/100336422201031505832337/

    nowait的含义很多人都会误解为“不用等待,立即执行”。但实际上该关键字的含义是“不用等待,立即返回”
    如果当前请求的资源被其他会话锁定时,会发生阻塞,nowait可以避免这一阻塞,因为
    If another user is in the process of modifying that row, we will get an ORA‐00054
    Resource Busy error. We are blocked and must wait for the other user to finish with
    it.
    可以实验下,我用pl/sql developer锁定表game
    SQL> select * from game where game_id =1;
    返回一条记录
     

    SQL> select * from game where game_id=1 for update nowait;
    select * from game where game_id=1 for update nowait
                 *
    ERROR位于第1行:
    ORA-00054:资源正忙,要求指定NOWAIT
    使用NOWAIT关键字,会报ORA‐00054的错误
     

    如何来查看是什么资源造成这样的情况呢?并且怎么解决呢?
    查看锁定的对象,用户和会话
    SQL> select lo.oracle_username,do.object_name,s.logon_time,lo.process,s.sid as s
    ession_id
     2 from v$locked_object lo,v$session s,dba_objects do
     3 where lo.session_id = s.sid and do.object_id = lo.OBJECT_ID
     4 /
    ORACLE_USERNAME
    ------------------------------
    OBJECT_NAME
    --------------------------------------------------------------------------------
     

    LOGON_TIME         PROCESS     SESSION_ID
    ------------------- ------------ ----------
    NBA---用户名称
    GAME---操作的对象
    2009-08-04 10:55:15---登录的时间     840:5176   10
     

    使用as sysdba
    根据sid查看具体的sql语句
    selectsql_textfromv$session a,v$sqltext_with_newlines b
    whereDECODE(a.sql_hash_value,0, prev_hash_value, sql_hash_value)=b.hash_value
     anda.sid=10;
    begin :id := sys.dbms_transaction.local_transaction_id; end;
     

    kill session
    SQL> select sid,serial# from v$session where sid =10;
     

          SID   SERIAL#
    ---------- ----------
           10        23
    SQL> alter system kill session '10,23';
     

    系统已更改。
     

    select * from game where game_id=1 for update nowait;
    有数据返回了

    当两个用户同时更新同一条记录是, 使用select for update,后执行者,会被阻塞,而使用select for update  nowait 则会抛出:ORA-00054 resource busy and acquire with NOWAIT specified 异常,告之用户这一行已经锁定。

  • 相关阅读:
    springboot 前后端分离开发 从零到整(三、登录以及登录状态的持续)
    鼠标跟随
    sublime_text编辑器下载安装使用
    实现el-dialog的拖拽,全屏,缩小功能
    vue 动态添加路由 require.context()
    Vue JsonView 树形格式化代码插件
    利用vue-gird-layout 制作可定制桌面 (二)
    利用vue-gird-layout 制作可定制桌面 (一)
    通过js 实现 向页面插入js代码并生效,和页面postMessage通讯
    简单实现一个ES5 Vue Dialog 插件
  • 原文地址:https://www.cnblogs.com/jjj250/p/2826593.html
Copyright © 2011-2022 走看看