首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>其他>正文

SELECT FOR UPDATE 相关的知识

http://www.oklinux.cn  2008-08-22  linuxidc   会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

SELECT FOR UPDATE 相关的知识

一个邮件发送的应用会每过一定的时间片去数据库中取未发的邮件然后发送邮件,成功后将数据库中邮件标识未发改为已发。

这个应用部署在websphere上,websphere采用是垂直克隆,有4个server,当4个server都开启的时候,就出现同时发4封相同的邮件给同一个用户。

这时,for update锁就可以解决这个问题!

1:状态解释
statement: 一个SQL语句。
session: 一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。
transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后 transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。
consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。

2:sql解释
LOCK的基本情况: update, insert ,delete, select ... for update会LOCK相应的ROW 。
只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。
LOCK由statement产生但却由TRANSACTION(commit,rollback)结尾,也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后LOCK才会RELEASE。

SELECT.... FOR UPDATE [OF cols] [NOWAIT];
OF cols: SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];

3:sql说明
a:关于OF
transaction A运行
select a.object_name,a.object_id from wwm2 a,wwm3 b where b.status='VALID' and a.object_id=b.object_id for update of a.status
则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.

反一下看看
transaction A运行
select a.object_name,a.object_id from wwm2 a,wwm3 b where b.status='VALID' and a.object_id=b.object_id for update of b.status
则transaction B可以对a表wwm2的相应行进行DML操作,但不能对b表wwm3相应行进行DML操作.也就是说LOCK的是行,只是如果不加OF的话会对所有涉及的表LOCK的,加了OF后只会LOCK OF 字句所在的TABLE.

b:关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并 立即结束 STATEMENT而不再等待).返回错误是"ORA-00054: resource busy and acquire with NOWAIT pecified"

注:另外如下用法也值得推荐,应该酌情考虑使用。
1:FOR UPDATE WAIT 5
5秒后会提示ORA-30006: resource busy; acquire with WAIT timeout expired
2:FOR UPDATE NOWAIT SKIP LOCKED;
会提示no rows selected
3:TABLE LOCKS
LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];
同样也是在transaction结束时才会释放lock。
4: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提示。


上一篇:记录Linux下一次oracle启动错误   下一篇:Linux网络程序碰到的一些问题手记

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·记录Linux下一次oracle启动错误
·MySQL列出某个月或是已知日期范围内的所有日期
·MySQL中select * for update锁表的问题
·MySQL的自增字段
·mysql数据文件破坏后的修复方法
·Oracle数据库里查看表空间使用状况
·Freebsd下非root用户的MySQL安装
·MySQL查看状态及简单优化
·详解在Linux或UNIX机器上设置多个DB2系统
·在Linux、Windows上如何按日期逻辑备份数据库
·Linux下C连接MySQL找不到MySQL.H的问题
·Ubuntu下的免安装MySQL
·MySQL的CSV引擎应用实例解析
·Oracle的sqlcode对应的错误信息sqlerrm
·Sybase 11.9.2 For Linux安装过程图文详解
·VC 连MySQL小记
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·记录Linux下一次oracle启动错误
·MySQL列出某个月或是已知日期范围内的
·MySQL中select * for update锁表的问题
·MySQL的自增字段
·mysql数据文件破坏后的修复方法
·Oracle数据库里查看表空间使用状况
·Freebsd下非root用户的MySQL安装
·MySQL查看状态及简单优化
·详解在Linux或UNIX机器上设置多个DB2系
·在Linux、Windows上如何按日期逻辑备份
·Linux下C连接MySQL找不到MySQL.H的问题
·Ubuntu下的免安装MySQL
  阅读排行
·Oracle建表过程初学
·Linux操作系统下MySQL的卸载、安装全过
·RHEL5.1 下安装Oracle 10.2.0.1及常见
·Linux系统中Oracle数据库的用户权限
·The busy Java developer's guide to d
·Oracle 建立临时表语法及使用技巧
·Linux平台下配置MySQL主从复制
·Linux平台下启动oracle 11g EM控制台
·Mysql JDBC驱动版本与Mysql版本的对应
·新建Oracle数据库三种方法
·Oracle客户端出现乱码的解决
·Linux下安装Oracle数据库完整笔记
·使用sybase过程中,数据库备份策略
·菜鸟在Linux系统中安装Oracle 11G
·INFORMIX SQL 介紹
网摘收藏: