选择更新sql是一种读写模式吗?

时间:2011-04-01 13:57:00

标签: plsql

我同时请求表中的特定行,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;

不幸的是,使用正确的序列正确更新主行,但当前范围会获取主范围的旧值。它做脏读。即使表的事务隔离级别是序列化的。 请问有人能告诉我这里发生了什么吗?

1 个答案:

答案 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语句根据单个条件执行插入或更新。