原文地址:http://blog.sina.com.cn/s/blog_61cd89f60102e7di.html
在生产数据库中,我们为了保证数据读、写的唯一性,经常会碰到下面五种锁语句,区别在那?相信对于新手而言真正搞懂的不多,下面我们用实例说明一下:
1.FOR UPDATE、
2.FOR UPDATE OF COLUMN、
3.FOR UPDATE WAIT 3、
4.FOR UPDATE NOWAIT、
5.FOR UPDATE NO WAIT SKIP LOCK
先看几个例子:
1.select * from Table for update --锁定表的所有行,只能读不能写
2.select * from Table where pkid = 1 for update --只锁定pkid=1的行
3.select * from Table a join Table b on a.pkid=b.pkid for update-- 锁定两个表的所有记录
4.select * from Table a join Table b on a.pkid=b.pkid where a.pkid = 10 for update --锁定两个
--表的中满足条件的行
5. select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行
for update 是把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表
第一点:
对于单个表读写操作而言,FOR UPDATE与FOR UPDATE OF COLUMN这两语句是一样的,不加条件是全表锁定,加条件是对行级别的锁定,我们举个例子
SELECT * FROM TABLE FOR UPDATE
SELECT * FROM TABLE FOR UPDATE OF TABLE_COLUMN
上面两个没有加WHERE条件,是对全表进行锁定
SELECT * FROM TABLE WHERE TABLE_COLUMN='条件' FOR UPDATE[FOR UPDATE OF COLUMN]
此时查询加了查询条件,是对表符合条件记录的一种行级别的锁定
再次提醒,FOR UPDATE 与FOR UPDATE OF 对于单表操作是一样的
那么FOR UPDATE OF 与 FOR UPDATE的区别在那呢,在多表进行操作时,FOR UPDATE OF只锁定列所在的表进行锁定,而且是表级别的锁定,FOR UPDATE是对多个表进行锁定,不懂看例子
1.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid
2.select * from Table1 a join Table b on a.pkid=b.pkid where a.pkid = 10 for update
1与2的区别在于,1只锁定表a,而2却要把两个表都要锁定,这才是二者真正的区别所在,即for update 是
把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表
第二点:关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)
当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).
WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。
“使用FOR UPDATE WAIT”子句的优点如下:
1.防止无限期地等待被锁定的行;
2.允许应用程序中对锁的等待时间进行更多的控制。
3.对于交互式应用程序非常有用,因为这些用户不能等待不确定
4.若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告
相关推荐
数据库oracle锁: for update of和for update的区别,解释得很清楚,有很多详细例子说明。
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
oracle的updateoracoracle的update的五种方式le的update的五种方式的五种方式oracle的update的五种方式
ORACLE_UPDATE_语句语法与性能分析
实际项目中遇到的问题总结:数据量百万级,千万级。Oracle中update语句的优化,一共四种方案,工作中遇到该类问题可以参考。
ORACLE UPDATE 语句语法与性能分析看法
例如: 两表(多表)关联update -- 仅在where字句中的连接 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='01' --01 为vip,00为普通 where ...
Oracle发布的Linux,内核支持asm driver
在某个业务受理子系统BSS中, --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户...
oracle 多表做update insert语句.docx
shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...
jre-7u55-windows-x64 sql 2014 jre-7u55-windows-x64 sql 2014
oracle发布的linux,内核支持asm driver
update :单表的更新不用说了,两者一样,主要说说多表的更新 代码如下: Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标 update ( select t.charger_id_ new_charger...
update 语句优化
oracle_11gR2_07 数据操作(select,insert,update,delete) 和 常用函数(count,max,min,avg,sum,decode,distinct)
判断是否存在,存在就update,不存在insert,不是用存储过程解决的。
oracle-j2sdk1.8-1.8.0+update181-1.x86-64.rpm
大数据组件,官方版本:CDH5.9.0 操作系统:CentOS7/RHEL7 完整系列: oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm