在默认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值大小,都能查出来。如下图所示: