我同时请求表中的特定行,PL / SQL语句用于通过读取同一表中主行的数据来更新表,并更新它读取的当前范围行和主行。 算法是这样的: -
Declare
variable declaration
BEGIN
Select (Values) into (values1) from table where <condition1> for update;
select count(*) into tempval from table where <condition2>;
if (tempval == 0) then
insert into table values(values);
else
select (values) into (values2) from table where <condition2> for update;
update table set (values1) where <condition2>;
end if
update table set (values1+incrval) where <condition1>
END;
不幸的是,使用正确的序列正确更新主行,但当前范围会获取主范围的旧值。它做脏读。即使表的事务隔离级别是序列化的。 请问有人能告诉我这里发生了什么吗?
答案 0 :(得分:0)
这是按设计工作的。 Oracle默认且只有读隔离使会话可以看到他们自己的所有更新。如果你执行:
INSERT INTO TABLE1 (col1) values (1);
COMMIT;
UPDATE TABLE1 SET col1 = 2 where col1 = 1;
SELECT col1 FROM TABLE1;
您将看到上次查询返回的2。请阅读Merge Explanation,了解如何使用MERGE语句根据单个条件执行插入或更新。