가장 최근에 업데이트 된 테이블이 덮어 쓰지 않도록 Mobilink가 테이블을 동기화하도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/941835

문제

다음은 시나리오입니다. Oracle Consolidated 데이터베이스가 있습니다. 핸드 헬드에서 사용되는 Sqlanywere 데이터베이스와 Oracle을 동기화하기 위해 Mobilink를 사용하고 있습니다. USERA가 핸드 헬드 장치의 원격 DB의 레코드를 "첫 번째 업데이트"로 변경 한 다음 10 분 후 userb는 핸드 헬드 장치의 동일한 레코드를 "업데이트 된 두 번째"로 업데이트하는 경우, 통합 데이터베이스가 항상 "업데이트 된 초"를 표시하려면 "업데이트 된 두 번째" 두 장치는 동기화됩니다. 현재 UserB가 Usera 이전에 동기화되면 연결 데이터베이스는 "업데이트 된 첫 번째"를 읽습니다.

도움이 되었습니까?

해결책

현재 Mobilink 서버에서 기본 충돌 해상도를 사용하고 있으므로 기본적으로 마지막 동기가 승리합니다. 이를 처리하려면 자신의 충돌 해결 체계를 구현해야합니다.

원격 데이터베이스에서 두 가지 일이 필요합니다.

1) 원격 데이터베이스의 표에 원격 사이트에서 레코드가 업데이트 된 시간을 추적하는 통합 데이터베이스와 동기화하는 원격 데이터베이스의 열에 열이 있어야합니다.

2) 원격 사이트의 시스템 시계를 신뢰해야합니다. 사람들이 갈등이 어떻게 해결되고 있는지 알아 내고 데이터가 충돌을 이기고 싶어한다면, 사용자가 원격 장치에서 시스템 시간을 다음 주에 변경하고, 데이터를 업데이트하고, 시스템 시간을 바꾸고, 시스템 시간을 변경하고, 시스템 시간을 변경하는 것을 막는 것은 아무것도 없습니다. 그런 다음 동기화됩니다.

통합에서는 갈등 해결을 구현해야합니다. 테이블에 블로브가 포함되어 있지 않은 한, upload_update 이벤트에서 테이블의 충돌 해상도를 작성할 수 있습니다. 원격 데이터베이스의 테이블을 다음과 같이 가정 해 봅시다.

create table Admin (
  admin_id           bigint default global autoincrement(1000000) primary key,
  data               varchar(64) not null,
  rem_last_modified  timestamp not null default timestamp
);

또한 매우 유사하게 보이는 통합 테이블의 테이블을 가정 해 봅시다. 또한 통합에서 행이 바뀌었을 때 추적 할 또 다른 수정 된 열이 있다고 가정 해 봅시다.

create table Admin (
  admin_id           bigint default global autoincrement(1000000) primary key,
  data               varchar(64) not null ,
  rem_last_modified  timestamp not null default ‘1900-01-01’,
  cons_last_modified timestamp default timestamp
);

일반적으로 upload_update 이벤트는 다음과 같습니다.

call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'update Admin set data = {ml r.data}, 
              rem_last_modified = {ml r.rem_last_modified}  
 where admin_id = {ml r.admin_id}'
);

대신 UPLOAD_UPDATE 이벤트를 다시 작성하여 저장 프로 시저를 호출하고 원격 데이터베이스에서 기존 행 값을 전달합니다.

call ml_add_table_script( 'v1', 'Admin', 'upload_update',
'call admin_upload_update( {ml r.admin_id}, 
    {ml r.data}, {ml r.rem_last_modified}, 
    {ml o.data}, {ml o.rem_last_modified}’
);

저장된 절차의 핵심은 업데이트를 수행 할 것이지만 업데이트의 where 절에는 기본 키 값과 원격 데이터베이스의 기존 행 값이 모두 포함됩니다. 누군가가 통합에서 행을 변경 한 경우이 업데이트는 0 행을 업데이트하고 충돌이 발생한다는 것을 알고 있습니다. 행을 업데이트하면 충돌이 없었습니다. 저장된 절차는 다음과 같은 것으로 보입니다 (아래의 pseudo-sql) :

create procedure admin_upload_update ( 
    @admin_id bigint, 
    @new_data varchar(64), 
    @new_rem_lmod timestamp,
    @old_data varchar(64), 
    @old_rem_lmod timestamp 
)
begin
    declare @cur_rem_lmod timestamp;
    update admin set data = @new_data, rem_last_modified = @new_rem_lmod
     where admin_id = @admin_id 
       and data = @old_data 
       and rem_last_modified = @old_rem_lmod;
    if @@rowcount = 0 then
        // conflict !!
        select rem_last_modified into @cur_rem_lmod 
          from admin where admin_id = @admin_id;
        if @new_rem_lmod > @cur_rem_lmod then
            // update using new_data and new_rem_lmod
        else 
            // do nothing, current values in cons wins
        end if;
    end if;  
end;

충돌 해결에 대한 자세한 내용은 V10 문서의 다음 섹션을 참조하십시오.

Mobilink- 서버 관리

동기화 기술

갈등을 다루기

http://dcx.sybase.com/index.php#http%3A%2F%2FDCX.sybase.com%2FHTML%2FDBMLEN10%2FML-conflicts-synch.html

다른 팁

TimeStamp 기반 다운로드 또는 스냅 샷 다운로드를 구현했다고 가정하면 마지막 동기화 이후 다른 리모컨에 의해 통합이 업데이트 된 경우 리모컨이 통합과 일치하도록 업데이트됩니다.

BTW, 동기화 모델을 설정하면 원하는 충돌 해결 유형을 사용할 수 있습니다 (http://dcx.sybase.com/index.php#http%3A%2F%2FDCX.sybase.com%2FHTML%2FDBMGEN10%2FMG-MG-ABOUT-S-50632A.html), 버전 10 이상으로 제공됩니다. Create Synchronization Model Wizard 또는 Mappings 페이지에서 모델이 생성 된 후 Mappings 페이지에서 Row 기반 또는 열 기반 충돌 감지를 원하는지 여부와 다양한 유형의 충돌 해상도를 선택할 수 있습니다. 원하는 것은 기존 타임 스탬프 열을 선택하는 "타임 스탬프"충돌 해상도 옵션에 해당합니다.

참고로 마법사는 매핑 페이지보다 옵션을 설명하므로 먼저 마법사에서 해당 옵션을 탐색하는 것이 좋습니다. "최신 승리, 유지 관리하는 타임 스탬프 열을 사용하는"옵션이 회색 인 경우 동기화 된 테이블에 타임 스탬프 열이 없음을 의미합니다.

모델을 만든 후에는 이벤트 페이지에서 생성 된 스크립트를 미리 볼 수 있습니다. 모델 설정이 완료되면 SQL 및 배치 파일을 생성하거나 데이터베이스에 직접 SQL을 적용하기 위해 모델을 배포합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top