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 异常,告之用户这一行已经锁定。
原文来源:
http://www.blogjava.net/parable-myth/archive/2010/11/05/337350.html?opt=admin
分享到:
相关推荐
标题和描述均聚焦于Oracle数据库中`FOR UPDATE`与`FOR UPDATE NOWAIT`两种锁定机制的区别,这在并发控制和事务处理中具有重要的意义。在深入解析这两种指令之前,我们先来简要回顾一下锁定机制的基本概念。 在...
### 数据库Oracle锁:FOR UPDATE OF与FOR UPDATE的区别 在Oracle数据库中,为了确保数据的一致性和准确性,尤其是在多用户环境中进行并发操作时,锁机制是必不可少的一部分。本文将详细介绍`FOR UPDATE`与`FOR ...
在Oracle数据库中,`UPDATE NOWAIT` 是一个用于事务处理的关键字,它允许你更新一行数据,但在数据被其他事务锁定时,它不会等待而是立即返回一个错误信息。这个特性对于处理多线程并发和确保数据一致性至关重要。...
- **OPEN-FOR, FETCH, and CLOSE**:另一种处理动态 SQL 的方法,用于循环读取结果集。 完整的 `EXECUTE IMMEDIATE` 语法如下: ```sql EXECUTE IMMEDIATE dynamic_SQL_string [INTO defined_variable1, defined_...
SELECT * FROM EMP WHERE EMPNO = 7788 FOR UPDATE NOWAIT; ``` - **注意事项**:NOWAIT选项用于防止其他事务挂起或导致死锁情况发生。如果不希望立即返回错误,可以选择使用WAIT子句指定等待时间,如`FOR UPDATE...
`SELECT FOR UPDATE`语句是Oracle中一种特殊的查询命令,它不仅检索数据,还为被检索的行加锁,直到当前事务结束。这可以防止其他事务在当前事务完成之前修改这些行。`SELECT FOR UPDATE`语句支持多种选项: - `OF ...
需要注意的是,这种锁定方式默认会阻止其他事务对该行的读取操作(除非指定`FOR UPDATE NOWAIT`)。 - 例如: ```sql SELECT * FROM table_name WHERE condition FOR UPDATE; ``` 3. **插入、更新和删除时的行...
删除HKDY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。 删除环境变量中的PATHT CLASSPATH中包含Oracle的值。 删除“开始”/“程序”中所有...
示例代码:SELECT * FROM emp FOR UPDATE NOWAIT; 3. 无效的 SQL 语句(90042000):当我们输入了一个语法错误的 SQL 语句时,Oracle 将抛出这个错误代码。例如,如果我们忘记了 FROM 关键字,将导致该错误。 示例...
如果尝试在锁定期间执行DDL,可能会遇到`ORA-00054: resource busy and acquire with NOWAIT specified`错误。 5级锁在处理主外键约束的UPDATE或DELETE时出现,以确保参照完整性。当更新或删除涉及关联表的记录时,...
例如,当用户执行`SELECT...FOR UPDATE`语句时,Oracle会在选定的行上设置一个排他锁,阻止其他用户在事务提交前对这些行进行更新。如果需要等待锁定的行,可以使用`FOR UPDATE WAIT`子句设置等待时间。 - **表级...
SELECT seq_name.NEXTVAL INTO :new.key_column FROM dual WHERE 1 = 0 FOR UPDATE NOWAIT; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -54 THEN RAISE; END IF; END; ``` 这段代码尝试获取序列值并立即锁定,...
CURSOR emp_cursor IS SELECT * FROM emp FOR UPDATE OF sal NOWAIT; v_comm NUMBER; BEGIN FOR r IN emp_cursor LOOP IF r.sal UPDATE emp SET sal = sal + 100 WHERE CURRENT OF emp_cursor; END IF; END ...
在实际应用中,DBA(数据库管理员)需要根据业务需求调整Oracle的并发参数,例如`SERIALIZABLE`、`READ COMMITTED`和`REPEATABLE READ`等事务隔离级别,以及`WAIT`和`NOWAIT`策略来控制锁定行为。此外,使用`SELECT ...
这通常通过`SELECT...FOR UPDATE NOWAIT`语句实现,该语句会在尝试更新前锁定数据行。 2. **乐观锁定**:相比之下,乐观锁定假设数据不太可能在修改过程中被其他会话更改。因此,它允许并发会话在没有锁定的情况下...
SELECT * FROM TEST WHERE ID = 10 FOR UPDATE NOWAIT; ``` 则会话A将立即获得锁定,否则将报错ORA-00054,表明没有立即获得锁定。 #### 六、更新锁定 假设会话A已经锁定了ID为10的记录,此时如果会话B尝试执行...