select语句for update
2017-09-23 08:14
477 查看
作用:
Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句。
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择
这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。
转自: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 vlockedobjectlo,vsession s,dba_objects do
3 where lo.session_id = s.sid and do.object_id = lo.OBJECT_ID
4 /
NBA—用户名称
GAME—操作的对象
2009-08-04 10:55:15—登录的时间 840:5176 10
使用as sysdba
根据sid查看具体的sql语句
selectsql_textfromvsessiona,vsqltext_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;
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 异常,告之用户这一行已经锁定。
Select…For Update语句的语法与select语句相同,只是在select语句的后面加FOR UPDATE [NOWAIT]子句。
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择
这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。
转自: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 vlockedobjectlo,vsession 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_IDNBA—用户名称
GAME—操作的对象
2009-08-04 10:55:15—登录的时间 840:5176 10
使用as sysdba
根据sid查看具体的sql语句
selectsql_textfromvsessiona,vsqltext_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 异常,告之用户这一行已经锁定。
相关文章推荐
- Mysql查询语句使用select.. for update导致的数据库死锁分析
- MySQL update && select ,update的同时select,和for update 语句说再见。
- Select For update语句浅析 (转)
- Select For update语句浅析
- Select For update语句浅析
- Select For update语句浅析
- oracle select语句中,不加for update和加 for update和for update nowait区别
- select ......for update 语句解释 (文章中有些地方描述的不是很准确)
- Select For update语句浅析
- Select For update语句浅析
- Select For Update 语句浅析
- MySQL update && select ,update的同时select,和for update 语句说再见。
- mysql SELECT FOR UPDATE语句使用示例
- Select…For Update语句与锁
- select语句for update作用
- Select For update语句浅析
- Select ..for update(nowait)语句在表级别上产生RS锁,在数据行上产生行级锁(是一种X锁)
- mysql SELECT FOR UPDATE语句使用示例
- Mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。
- select语句for update---转载