楼主早上好。
你的理解有点儿不对的地方。
加锁是针对事务来说的,不是针对某个SQL语句来说的。
你把不同的SQL写到了同一个存储过程中,在一个session中顺次实现,也就是在同一个事务中进行的,只能说“这个事”务把表或者行加了锁,但是因为SQL都是在这个事务中,不会去竞争他们共有的这个锁;
而如果此时,你再在其他窗口登录了数据库,有了第2个Session(第2个事务),再对这张表进行操作,那么这个新的事务,才会去竞争第1个事务的锁,才会产生你说的“被锁住”的现象。

解决方案 »

  1.   

    经过测试部报错
    begin
      -- Call the procedure
      test;
    end;create or replace procedure test
    is
    begin
    insert into tb
    select 1 from dual;update tb set id=2 where id=1;
    end;
      

  2.   

    在一个会话,在同一个事务中,他们共有一个锁并且不会竞争这个锁,所以insert执行后,update依然可以进行。
      

  3.   

    这两条语句都是在一个事物中是可以对该条记录实行dml语句的,这条记录确实有个行级锁,如果在开启一个事物将不会获得锁,就不会更新,只会一直等待!