我想请问一下为什么在一个oracle存储过程中,可以对同一条记录先新增,后更新而不报错?
附上存储过程createorreplaceprocedureinsertDateisbegininsertintot_aavalues('11','11');update...
附上存储过程
create or replace procedure insertDate is
begin
insert into t_aa values ('11', '11');
update t_aa set name = '22' where id = '11';
commit;
exception
when others then
rollback;
end;
当insert的语句执行的时候还没有commit,这时候这条记录应该是被行级锁锁住的,后面的update语句在去更新这条记录的时候应该报错才对把?为什么更新还是成功的?
还是我的理解有错误? 展开
create or replace procedure insertDate is
begin
insert into t_aa values ('11', '11');
update t_aa set name = '22' where id = '11';
commit;
exception
when others then
rollback;
end;
当insert的语句执行的时候还没有commit,这时候这条记录应该是被行级锁锁住的,后面的update语句在去更新这条记录的时候应该报错才对把?为什么更新还是成功的?
还是我的理解有错误? 展开
1个回答
展开全部
是这样的,这是因为你这里的insert跟update是同一个事务,所以是可以update的到的,不会报错。
insert/update/delete这些DML语句以及select * from table_name for update都会在表上加RX锁(其中select for update用于在读数据过程中禁止其他事务对所读数据进行DML操作)。操作完成后commit或rollback解锁。
当执行相应的语句的时候,系统自动在所要操作的表上申请表级RX锁,当表级锁获得后,系统再自动申请TX行级锁,并将相应数据行加X锁。当表上加RX锁后,不许其他事务对该表加X排他锁(如drop table),不允许其他事务对该表加X锁(如建索引);但允许其他事务对该表再加RS锁(如执行lock table in row share mode)或RX锁(如插删改记录,注意,其他事务在同一表上再加RX表锁没问题,但是再加行锁时,不能再加在表内已加X锁的数据行上,而只允许加在表内其他数据行上)。
而你这里的例子本身就是一个事务,就好比你对一个新建的表Insert记录后不commit,但是你select * from table_name的时候也是可以看到刚insert的记录的不是么。而如果同时有第二个事务select该表或者update某记录 都会显示未选定行的。
这样回答解决你的疑问了么?
insert/update/delete这些DML语句以及select * from table_name for update都会在表上加RX锁(其中select for update用于在读数据过程中禁止其他事务对所读数据进行DML操作)。操作完成后commit或rollback解锁。
当执行相应的语句的时候,系统自动在所要操作的表上申请表级RX锁,当表级锁获得后,系统再自动申请TX行级锁,并将相应数据行加X锁。当表上加RX锁后,不许其他事务对该表加X排他锁(如drop table),不允许其他事务对该表加X锁(如建索引);但允许其他事务对该表再加RS锁(如执行lock table in row share mode)或RX锁(如插删改记录,注意,其他事务在同一表上再加RX表锁没问题,但是再加行锁时,不能再加在表内已加X锁的数据行上,而只允许加在表内其他数据行上)。
而你这里的例子本身就是一个事务,就好比你对一个新建的表Insert记录后不commit,但是你select * from table_name的时候也是可以看到刚insert的记录的不是么。而如果同时有第二个事务select该表或者update某记录 都会显示未选定行的。
这样回答解决你的疑问了么?
追问
谢谢的你回答,我还是有些模糊,你的意思是,只要是在同一个事务中,对同一条数据进行的增删改的操作都是不会导致报错的。但是在不同的事务中,表级锁和行级锁才会起作用,是这个意思么?
追答
是的,,锁的作用就是在这里:你自己这事务为表加了表锁,给行加了行锁,就是为了之后的操作(如各种DML操作),加锁就是为了防止在你commit或者rollback之前被别人操作,所以同一个事务是不会报错的。锁是为了排斥其他事务的影响。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询