首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务和Oracle dblink

事务和Oracle dblink
EN

Database Administration用户
提问于 2014-12-24 19:07:54
回答 1查看 4.1K关注 0票数 2

我有两个dbs,让我们称它们为写b和readdb。Readdb有一个用于写b的dblink,还有一个指向该dblink上的表的视图。

我对该表进行了更新,该表的视图指向dblink,然后从该表读取。即使我将隔离级别设置为SERIALIZABLE,在事务提交之后,我似乎也会看到几秒钟的旧值。

这说得通吗?

B.书面形式:

代码语言:javascript
复制
create table mk.dblink_test (
id varchar2(16),
status varchar2(16));

insert into mk.dblink_test
SELECT rownum, 'ACTIVE'
FROM   dual
CONNECT BY LEVEL <= 1000000;

在重新登记时:

代码语言:javascript
复制
CREATE DATABASE LINK DBL_TEST CONNECT TO mk IDENTIFIED BY password USING 'writedb:1521/qa'

直接更新写b的SQL:

代码语言:javascript
复制
update mk.dblink_test
set status = 'DONE'
where id = '1';
commit;

现在,使用SQL进行脏读取的情况是很奇怪的。以下更简单的查询

代码语言:javascript
复制
SELECT r.status
FROM mk.dblink_test@DBL_TEST r
WHERE r.id = '1';
commit;

似乎没有表现出问题。但是有一个更复杂的版本:

代码语言:javascript
复制
SELECT r.status
FROM mk.dblink_test@DBL_TEST r
LEFT OUTER JOIN (SELECT '3' status from dual) optout ON optout.status = r.status
WHERE r.id = '1';
commit;

90%可靠地复制。复制步骤:

  1. 启动sqlplus并连接到readdb
  2. 运行读取查询,获取状态“活动”
  3. 在另一个sqlplus中对写b运行更新查询
  4. 从步骤(1)返回sqlplus,从步骤(2)启动读取查询,然后再次获得“活动”
  5. 重复读取查询,与步骤4相同--获得正确的“完成”响应。
EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-01-02 15:17:48

甲骨文说:

http://docs.oracle.com/cd/B19306_01/server.102/b 14231/ds_txnman.htm#i1008473

当基本表中不存在更改时,分布式查询在连续运行时返回不同的结果。(医生ID 561471.1)

...skip更多的写作..。

Bug.611416更新和提交后的SELECT没有显示更新的列

...skip更多的写作..。

“您可以使用以下技术确保在查询之前同步这两台机器的SCN:*因为SCN在远程查询结束时是同步的,所以在每个远程查询之前使用一个虚拟的远程查询在同一个站点上进行同步,例如,选择* FROM @ remote。*因为SCN在每个远程事务开始时都是同步的,所以在发出远程查询之前提交或回滚当前事务。”

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/86973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档