日期:2014-05-17  浏览次数:20960 次

我想请问一下oracle存储过程新增更新的问题
我想请问一下为什么在一个oracle存储过程中,可以对同一条记录先新增,后更新而不报错?
create or replace procedure insertUpdateData is
begin
  insert into t_a values ('11', '11');
  update t_a set name = '22' where id = '11';
  commit;
exception
  when others then
    rollback;
end;
当insert的语句执行的时候还没有commit,这时候这条记录应该是被行级锁锁住的,后面的update语句在去更新这条记录的时候应该报错才对把?为什么更新还是成功的?
还是我的理解有错误?
------解决方案--------------------
楼主早上好。
你的理解有点儿不对的地方。
加锁是针对事务来说的,不是针对某个SQL语句来说的。
你把不同的SQL写到了同一个存储过程中,在一个session中顺次实现,也就是在同一个事务中进行的,只能说“这个事”务把表或者行加了锁,但是因为SQL都是在这个事务中,不会去竞争他们共有的这个锁;
而如果此时,你再在其他窗口登录了数据库,有了第2个Session(第2个事务),再对这张表进行操作,那么这个新的事务,才会去竞争第1个事务的锁,才会产生你说的“被锁住”的现象。