使用游标读取数据过程中,有其它用户插入符合条件数据,能否被读取?

  在默认Committed Read隔离级别下,用户USER1用游标去遍历表读数据,在这个过程中,用户USER2插入了1条也符合条件的数据,这条数据能否被读取呢?

  分两种场景对以上问题进行测试:

  • 首先,创建表t_emp,并插入200万条数据

create table t_emp (id integer,name char(50))
extent size 8 next size 8;

  • 场景一:在t_emp(id)上创建索引,游标以t_emp(id)升序方式读取数据。
create index idx_empid on t_emp(id);

drop procedure pro_read_emp();

create procedure pro_read_emp() returning int 
    define v_count int;
	define v_name char(16);
	let v_count=0;
	foreach cursor_cus for select name into v_name from t_emp order by no asc
            let v_count = v_count+1;
	end foreach;
	return v_count;
end procedure;

call pro_read_emp();

  测试发现,在USER1调用存储过程时,当USER2插入的id值较大,会被读取;当USER2插入的id值较小,不会被读取。如下图所示:

  • 场景二:不在t_emp(no)上创建索引索引
drop index idx_empid on t_emp(id);

  这种情况下,在USER1调用存储过程时,不管USER2插入的id值大小,都能查出来。如下图所示: