2013-04-29 1 views
0

외래 키 관계가 있지만 외래 키 제약 조건이없는 두 개의 원격 테이블 A_REM 및 B_REM이 있으며 테이블 A_REM에는 약 10,000 개의 새 행이, 일에는 테이블 B_REM 에 약 50,000 개의 새 행이 있습니다. 대부분의 작업은 삽입 작업입니다. 이제 A_REM과 B_REM에서 로컬 테이블 A_LOC과 B_LOC로 데이터를 이동하면서 처리하는 동안 행을 잠그고 싶습니다. 이동 후 테이블 A_REM 및 B_REM에서 행을 삭제해야합니다.DB 링크를 통해 관련 원격 테이블에서 데이터 이동

A_REM B_REM 
1 ----- |_ 1 
     |_ 2 
     |_ 3 
-------------------- 
2 ----- |_ 4 
     |_ 5 rows 2 and 4-6 are locked while moving 
     |_ 6 
-------------------- 
3 ----- |_ 7 
     |_ 8 
     |_ 9 

테이블 A_REM 및 B_REM (일관성)의 데이터 관계를 유지하면서 데이터를 이동하는 가장 좋은 방법은 무엇입니까. 테이블이 하나만있는 경우 "FOR UPDATE OF"문을 커서 (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#CHDGEHBF)와 함께 사용합니다.

미리 감사드립니다.

+0

고유 한 복제 솔루션을 구축하려는 것 같습니다. 오라클의 기본 복제 기술을 활용하지 않는 이유가 있습니까? 예를 들어, 별도의 변경 테이블을 유지 관리하지 않고 로컬 시스템에서 구체화 된보기를 작성하고 원격 시스템에서 구체화 된보기 로그를 작성할 수 있습니까? 스트림이나 CDC를 사용할 수 있습니까? –

+0

예, 표준 복제 솔루션이 가장 좋습니다. 그러나 현재로서는 하나를 수립 할 수 없습니다. 감사. – Toru

답변

0

트랜잭션에 원격 데이터베이스가 하나만있는 경우 분산 트랜잭션이 아니므로 여러 원격 데이터베이스의 분산 트랜잭션과 달리 로컬 트랜잭션과 동일하게 작동합니다. 다음 예제에서는 적절한 행 레벨 잠금을 확보하고 필요한 데이터 일관성으로 단일 작업 단위 (UOW)에서 데이터를 이동하는 방법을 보여줍니다.

create table a_rem (aid number, acontent varchar2(10)); 
create table b_rem (bid number, aid number, bcontent varchar(10)); 

create table a_loc (aid number, acontent varchar2(10)); 
create table b_loc (bid number, aid number, bcontent varchar(10)); 

insert into a_rem values (1, 'A-One'); 
insert into a_rem values (2, 'A-Two'); 
insert into a_rem values (3, 'A-Three'); 

insert into b_rem values (1, 1, 'B-One'); 
insert into b_rem values (2, 1, 'B-Two'); 
insert into b_rem values (3, 2, 'B-Three'); 
insert into b_rem values (4, 3, 'B-Four'); 
insert into b_rem values (5, 3, 'B-Five'); 

commit; 
-- look Ma, no data integrity! :(

-- let us pretend I want to move a_rem.aid = 2 information from both tables 
declare 
    cursor row_level_locks is 
    select a.*, b.* 
    from a_rem a, b_rem b 
    where a.aid = b.aid and a.aid = 2 
     for update; 
begin 
    open row_level_locks; -- begins transaction, obtains proper row level locking 
    insert into a_loc select * from a_rem where aid = 2; 
    insert into b_loc select * from b_rem where aid = 2; 
    delete a_rem where aid = 2; 
    delete b_rem where aid = 2; 
    commit; 
    close row_level_locks; 
end; 

최종 노트 : 데이터 무결성은 두 테이블 사이의 중요하다면, 먼저 가서 B_REM 참조 A_REM에 그 외래 키 제약 조건을 만들 수 있습니다. 당신이/할 수 없다면, 데이터 무결성은 중요하지 않습니다. 그것을 취하지 않는 것이 중요하고 사소한 단계 일 수는 없습니다.

관련 문제