讲解有关SELECT FOR UPDATE的一些概念
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。
前面的FOR UPDATE省略,下面我们来讲一下OF。
则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.
反一下看看。
则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"
另外如下用法也值得推荐,应该酌情考虑使用。
5秒后会出现提示:
出现提示:
同样也是在transaction结束时才会释放lock。
DEADLOCK:
也就是说两个transaction都相互试图去lock对方已经lock的ROW,都在等待对方释放自己的lock,这样就使死锁。另外,deadlock也会有600提示。
- 最新文章
- Select语句究竟是如何来使用索引的?[02-28]
- 一条SQL语句变得巨慢的原因及其解决方法[02-28]
- SQL Server数据库的线程与纤程[02-28]
- 解决行转列,列分行,行合并列的疑难问题[02-28]
- MS-SQL数据库开发—精典[02-28]
- 查看当前进程,或死锁进程,并能自动杀掉死进程[02-28]
- 相关文章
- Oracle向SQL开发者伸出援手[02-28]
- SQLSERVER,ORACLE,MYSQL高效分页查询[02-28]
- oracle 10g 安装中一些问题解决[02-27]
- 在UNIX服务器上设置Oracle8i全文检索[02-27]
- ORacle Outer Join usage.外连接使用[02-27]
- 在SQL Server上如何创建Oracle链接服务器?[02-27]
