كيف تحصل على Mobilink لمزامنة الجداول بحيث لا يتم الكتابة فوق الجدول المحدث أحدث؟

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

سؤال

هنا هو السيناريو. لدي قاعدة بيانات موحدة أوراكل. أنا أستخدم Mobilink لمزامنة Oracle مع قاعدة بيانات SQLanyWere التي يتم استخدامها على يده. إذا قامت Usera بتغيير سجل في جهاز التحكم عن بعد على جهاز DB الخاص به على جهاز "محدث أولا"، ثم يقوم UserB بعد 10 دقائق بتحديث نفس السجل على جهازه المحمول "تحديث ثان" أريد أن تظهر قاعدة البيانات الموحدة دائما "تم تحديث الثانية" بعد يتم مزامنة الجهازين. حاليا إذا قام UserB بمزامنة قبل Usera، فإن قاعدة البيانات الموحدة ستقرأ "تحديث أولا".

هل كانت مفيدة؟

المحلول

الآن، تقوم باستخدام دقة التعارض الافتراضية في خادم Mobilink، لذلك افتراضيا آخر Synch في WINS. ستحتاج إلى تنفيذ نظام حل النزاعات الخاص بك للتعامل مع هذا.

سيتطلب ذلك أن تحدث شيئين في قاعدة البيانات البعيدة:

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}’
);

مفتاح الإجراء المخزن الخاص بك هو أننا سنقوم بتحديثا، لكن جملة التحديث حيث سيتضمن كل من القيم الرئيسية الأساسية وقيم الصف القديم من قاعدة البيانات البعيدة. إذا قام شخص ما بتغيير الصف، فسوف يقوم هذا التحديث بتحديث صفوف صفر، ونحن نعرف حدوث صراع. إذا كان يقوم بتحديث صف، فلا يوجد تعارض. سيبدو الإجراء المخزن الخاص بك شيء مثل هذا (SQL 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:

موبيلينك - إدارة الخادم

تقنيات المزامنة

معالجة الصراعات

http://dcx.sybase.com/index.php#http٪3a٪2f٪2fdcx.sybase.com٪2fhtml٪2fdbmlen10٪2fml-conflicts-synch.html.

نصائح أخرى

على افتراض أنك قد قمت بتنفيذ التنزيلات الطوابع الطوابع الطوابع الخارجية أو التنزيلات اللقطة، فسيتم تحديث جهاز التحكم عن بعد لمطابقة الموحدة، إذا تم تحديث عملية تشغيل أخرى من خلال المزامنة الأخيرة.

راجع للشغل، نوع حل الصراع الذي تريده متاحا إذا قمت بإعداد نموذج المزامنة (http://dcx.sybase.com/index.php#http٪3a٪2f٪2fdcx.sybase.com٪2FHTML٪2FDBMGen10٪2FMG-MG-About-s-5060632a.html.)، متاح في الإصدار 10 وما فوق. إما في "معالج نموذج المزامنة"، أو في صفحة التعيينات بعد إنشاء النموذج، يمكنك اختيار ما إذا كنت تريد اكتشاف الصراع المستندة إلى الصف أو العمود، وأنواع مختلفة من حل النزاعات. ما تريده يتوافق مع خيار "Timestamp" عن حل النزاعات، حيث يمكنك اختيار عمود زمني موجود.

في FYI، يشرح المعالج الخيارات أكثر من صفحة التعيينات، لذلك أوصي باستكشاف هذه الخيارات في المعالج أولا. لاحظ أنه إذا كان "الأحدث WINS، باستخدام عمود Timestamp الذي تحافظ عليه" خيار رمي، فهذا يعني أنه لا يوجد عمود زمني في الجدول (الجدول) المتزامن.

بمجرد إنشاء نموذج، يمكنك معاينة البرامج النصية التي تم إنشاؤها في صفحة الأحداث. عند الانتهاء من إعداد النموذج، تقوم بنشره لإنشاء ملفات SQL وملفات الدفعات و / أو تطبيق SQL مباشرة إلى قواعد البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top