oracle select for update
2011-12-05 22:28
896 查看
statement: 一个SQL语句。
session: 一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。
transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。
LOCK的基本情况:
update, insert ,delete, select ... for update会LOCK相应的ROW 。
只有一个TRANSACTION可以LOCK相应的行,也就是说假如一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会RELEASE。 Sql代码
SELECT.... FOR UPDATE [OF cols] [NOWAIT]; OF cols SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];
前面的FOR UPDATE省略,下面我们来讲一下OF。
transaction A运行
Sql代码
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of a.status
则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.
反一下看看。
transaction A运行
Sql代码
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of b.status
则transaction B可以对a表wwm2的相应行进行DML操作,但不能对b表wwm3相应行进行DML操作.
也就是说LOCK的还是行,只是假如不加OF的话会对所有涉及的表LOCK的,加了OF后只会LOCK OF 字句所在的TABLE.
NOWAIT(假如一定要用FOR UPDATE,我更建议加上NOWAIT)
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified"
另外如下用法也值得推荐,应该酌情考虑使用。
FOR UPDATE WAIT 5
5秒后会出现提示:
ORA-30006: resource busy; acquire with WAIT timeout expired
FOR UPDATE NOWAIT SKIP LOCKED;
出现提示:
no rows selected
TABLE LOCKS
LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];
同样也是在transaction结束时才会释放lock。
DEADLOCK:
transaction a lock rowA , then transaction b lock rowB
then transaction a tries to lock rowB,
and transaction b tries to lock rowA
也就是说两个transaction都相互试图去lock对方已经lock的ROW,都在等待对方释放自己的lock,这样就使死锁。另外,deadlock也会有600提示。
新闻来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2008/0202/46873.html
session: 一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。
transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。
LOCK的基本情况:
update, insert ,delete, select ... for update会LOCK相应的ROW 。
只有一个TRANSACTION可以LOCK相应的行,也就是说假如一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION结尾(commit,rollback),也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后才会RELEASE。 Sql代码
SELECT.... FOR UPDATE [OF cols] [NOWAIT]; OF cols SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];
SELECT.... FOR UPDATE [OF cols] [NOWAIT]; OF cols SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];
前面的FOR UPDATE省略,下面我们来讲一下OF。
transaction A运行
Sql代码
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of a.status
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of a.status
则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.
反一下看看。
transaction A运行
Sql代码
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of b.status
select a.object_name,a.object_id from wwm2 a,wwm3 b 2 where b.status='VALID' and a.object_id=b.object_id 3* for update of b.status
则transaction B可以对a表wwm2的相应行进行DML操作,但不能对b表wwm3相应行进行DML操作.
也就是说LOCK的还是行,只是假如不加OF的话会对所有涉及的表LOCK的,加了OF后只会LOCK OF 字句所在的TABLE.
NOWAIT(假如一定要用FOR UPDATE,我更建议加上NOWAIT)
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified"
另外如下用法也值得推荐,应该酌情考虑使用。
FOR UPDATE WAIT 5
5秒后会出现提示:
ORA-30006: resource busy; acquire with WAIT timeout expired
FOR UPDATE NOWAIT SKIP LOCKED;
出现提示:
no rows selected
TABLE LOCKS
LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];
同样也是在transaction结束时才会释放lock。
DEADLOCK:
transaction a lock rowA , then transaction b lock rowB
then transaction a tries to lock rowB,
and transaction b tries to lock rowA
也就是说两个transaction都相互试图去lock对方已经lock的ROW,都在等待对方释放自己的lock,这样就使死锁。另外,deadlock也会有600提示。
新闻来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2008/0202/46873.html
相关文章推荐
- Oracle的select for update
- 【Oracle】从select for update开始
- Oracle基础知识(二十四) - select for update
- oracle的select for update
- Oracle数据之select * for update恢复小结(1)
- Oracle中select ... for update的用法
- oracle select语句中,不加for update和加 for update和for update nowait区别
- Oracle中的select for update
- Oracle select for update & for update of
- oracle select for update
- select ... for update在mysql和oracle间锁行为的比较
- oracle-select for update nowait 与 select for update 差别
- SELECT ... FOR UPDATE(WAIT/NOWAIT)命令与ORACLE锁
- Oracle:for update 和select t.*,t.rowid编辑数据的区别
- Oracle中的select for update
- 用锁实现SQLSERVER中并发控制--实现Oracle中select .... for update功能
- oracle用select for update 中断后无法操作表的处理:杀掉SESSION
- Oracle Select...for update作用
- Oracle编辑数据时提示:这些查询结果不可更新,请使用ROWI或者SELECT……FOR UPDATE获得可更新结果。
- oracle Select For update语句浅析