Ⅰ 数据库中Select For update语句的解析
他们已经说了相关的东西了
我再补充几点:
分成两类:加锁范围子句和加锁行为子句
加锁范围子句:
在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁
加锁行为子句:
当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。
在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。
For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。
那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。
Ⅱ for update和for update nowait 的意思
http://..com/question/59860423.html
for update的作用是用于对选择的行加排他锁的,在有些情况下,事务的处理需要先选中一些记录,再对这些记录进行处理.因此需要排他锁.
而for update nowait的作用与for update相同,不同的是其他事务申请被锁定的行数据时是等待该事务释放资源,还是直接返回无法获得资源
Ⅲ 如何使用select...for update 进行修改
就是让你在Select 语句最后加上 “ for update"
但看你的语句是联合多表并且是经过聚合运算的,可能无法修改,因为无法映射到原始的记录上。
Ⅳ 在java sql代码中select * from X for update 的作用是什么
for update 作用,可手动修改select * from X查询出来的结果集,可以做修改某个字段,删除和增加字段。
方法是先解锁(SQL window下有一行工具栏,左数第二个图标,点击锁头图标,使其处于开锁状态。此操作对于其他用户此表处于锁表状态,无法对该表做除查询以外操作)就可以直接点击相应字段进行修改值。也可以点击“+”增加对象,也可以点击“-”删除对象,做完修改后点击锁头,然后按快捷键F10(commit)。
这个功能经常用来手动批量向表插入大量数据,用来做测试使用。
Ⅳ sql 后面跟 for update 什么意思
这是plsql中特有的,用于修改非批量的数据。
执行完sql语句后,点红框中的锁的图标,就可以修改数据了
Ⅵ select语句后以for update结尾是什么意思
可以对这段返回的结果集进行修改
虽说实际上是这样,但是操作中是不允许有复杂(聚合、联接)计算的,一般只是select 一张表,充其量加上些where语句,然后就可以进行修改数据,修改完成后可以commit
从原理上来说 for update就是一中并发性的行级锁机制,要叙述需要很大篇幅,具体可以网络
Ⅶ sql 关于 for update 的问题
update 用法是:
update table a, table (select distinct * from (select K_KPBH as K_KPBH,max(K_BGXH) as K_BGXH from ZC_KPXXB where K_KPBH in (select www from lp234) group by K_KPBH) a left outer join ZC_KPXXB b on a.K_KPBH=b.K_KPBH and a.K_BGXH=b.K_BGXH) b set a.XX = b.XX where a.YY = b.YY
Ⅷ pl/sql 中 for update 问题
个人发现的大概是四点吧
1.是不是r_Record没有定义为r_Record c_tb1_1%rowtype;的原因。
2.是不是游标SELECT语句里使用了别名的缘故,游标里的查询测试过没,有没有问题。
3.就是用到WHERE CURRENT OF的时候,两张表的话需要指定FOR UPDATE OF R1.FIRST ,R2.FIRST;
4.但是两张表的情况UPDATE 一张表WHERE CURRENT OF就要出错,试试UPDATE两张表,用替代触发器更新多表视图看看?
你看看这里http://www.itpub.net/thread-937399-1-1.html同样的问题。
以前没遇到过WHERE CURRENT OF的问题,以前只知道有个FOR UPDATE的,今天刚好学习学习哈哈。貌似这个是新特性还是什么,WHERE CURRENT OF要用在释放游标前,网上好多这方面的资料都是E文的,现在在出差不方便试验,回去再试验看看,楼主你要有结论了回复下哈。
create or replace procere XXXXXXXX
--这里的XXXXXXX()括号里面应该有定义输入或者输出参数的
is
--下面是定义一个游标,SELECT语句是一个查询,你单独测试下这个查询看看有问题没
--游标里面查询语句含AS同义词不知道会不会有问题
cursor c_tbl_1 is
SELECT
R1.FIRST,
TO_CHAR(ADD_MONTHS(TO_DATE(R1.TIME,'YYYYMM'),1),'YYYYMM') AS SECOND,
R2.YEAR AS THIRD
FROM
A R1
INNER JOIN
B R2
ON
R2.FIRST = R1.FIRST
AND R2.TIME = TO_CHAR(ADD_MONTHS(TO_DATE(R1.TIME,'YYYYMM'),1),'YYYYMM')
FOR UPDATE OF R1.FIRST,R2.FIRST; --这里有修改加了个字段
--如果r_Record没有定义,那么需要指明r_Record c_tb1_1%rowtype
r_Record c_tb1_1%rowtype;--添加的语句。
begin
for r_Record in c_tbl_1 loop --r_Record没有定义
UPDATE A
SET
TIME = r_Record.SECOND,
YEAR = r_Record.THIRD
WHERE CURRENT OF c_tbl_1;
--上面的FOR UPDATE是双表,这里UPDATE是单表出问题的吧。
end loop;
commit;
exception
when others then
rollback;
end XXXXXXXX;
Ⅸ Oracle查询中Select * from fan where id = ‘a1’ for update请问这个for update在这里是什么意思
应该是这一条sql语句支持更新操作。如果你执行就可以看到提交、回滚按钮被激活 ,表示有数据改动操作
Ⅹ plsql forupdate怎么手动在尾行加多条数据
1、采用insert into values 语句插入一条,写很多条语句即可多条数据,这种主要针对于离散值以及一些基础信息的录入,如:insert into test(xh,mc) values('123','测试');
如果插入的数据有规律,可利用for、loop循环插入,主要用于批量生成测试数据
begin
for i in 1 .. 100 loop
insert into test(xh,mc) values(i||'','测试');
end loop;
end ;。
2、采用insert into selct from 语句来一次性插入一个集合,这种主要依据于要插入的数据源已经存储于数据库对象中,或者利用al虚表来构造数据,经过加工后写入一个集合。
insert into test (xh,mx) select '123','测试' from al;
3、采用plsql等工具、或者oracle的imp、impdp命令来导入,这种主要用数据库与数据库之间的大批量数据导入,导入的数据格式为plsql的pde、oracle的dmp等。dmp文件可使用
table_exists_action参数控制导入动作:replace替换原表,truncate清除原表数据再导入,append增量导入数据,当然impdp数据泵的导入要依赖于directory路径。
impdp 用户名/密码 mpfile=123.dmp logfile=123.log directory=imp_dir tables=test table_exists_action=append
4、使用excel文件直接拷贝。这种主要用于要写入的数据已是excel文件或者行列分明的其它格式文件,每一列的值和表结构相对应,可直接打开表的行级锁,把数据拷贝进入。
打开行级锁方法:
select t.*,rowid from 表名 t where 1=2;
select * from 表名 where 1=2 for update;
直接把excel数据拷贝到表里