تحرير سجلات قاعدة بيانات متعددة المستخدمين

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

  •  08-06-2019
  •  | 
  •  

سؤال

لقد صممت جداول قاعدة البيانات (إتفاق على MS SQL server) و خلق مستقل النوافذ الأمامية لأحد التطبيقات التي سيتم استخدامها من قبل عدد قليل من المستخدمين من إضافة و تحرير المعلومات.نحن سوف تضيف واجهة ويب تسمح البحث عبر الإنتاج المنطقة في موعد لاحق.

أشعر بالقلق من أنه إذا كان اثنين من المستخدمين البدء في تحرير نفس التسجيلة ثم آخر على ارتكاب التحديث يكون الفائز و معلومات هامة قد تكون فقدت.عددا من الحلول التي تتبادر إلى الذهن ولكن لست متأكدا إذا أنا ذاهب لإنشاء أكبر الصداع.

  1. لا تفعل شيئا و نأمل أن اثنين من المستخدمين لن تكون التحرير نفس السجل في نفس الوقت. - قد لا بحدوث لكن ماذا لو لم يفعل ؟
  2. تحرير الروتينية يمكن تخزين نسخة من البيانات الأصلية فضلا عن تحديثات ثم قارن عندما يقوم المستخدم الانتهاء من التحرير.إذا كانت تختلف عرض المستخدم و تحديث comfirm - يتطلب نسختين من البيانات المخزنة.
  3. إضافة آخر تحديث التاريخ والوقت عمود والتحقق من ذلك المباريات عندما كنا التحديث ، إذا لم يكن ثم تظهر الاختلافات. - يتطلب عمود جديد في كل من الجداول ذات الصلة.
  4. إنشاء تحرير الجدول أن يسجل عندما يبدأ المستخدمون تحرير محضر التي سيتم فحصها و منع المستخدمين الآخرين من تحرير نفس السجل. - يتطلب حذر فكرت في تدفق البرنامج لمنع المآزق السجلات أصبحت مؤمنا إذا كان المستخدم تعطل للخروج من البرنامج.

هل هناك أي حلول أفضل أو يجب أن أذهب للحصول على واحدة من هذه ؟

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

المحلول

إذا كنت تتوقع نادرة الاصطدامات ، تزامن هو على الأرجح أفضل رهان.

سكوت ميتشل كتب تعليمي شامل على تنفيذ هذا النمط:
تنفيذ متفائل التزامن

نصائح أخرى

الكلاسيكية النهج هو على النحو التالي:

  • إضافة حقل منطقي , "مؤمن" إلى كل جدول.
  • تعيين هذه القيمة إلى false بشكل افتراضي.
  • عندما يبدأ مستخدم التحرير ، يمكنك القيام بذلك:

    • قفل الصف (أو الجدول بأكمله إذا لم تتمكن من قفل الصف)
    • تحقق العلم على الصف الذي تريد تحريره
    • إذا كان العلم صحيحا ثم
      • إعلام المستخدم أنهم لا يستطيعون تحرير هذا الصف في هذه اللحظة
    • آخر
      • تعيين العلامة إلى true
    • الإفراج قفل

    • عند حفظ القياسي العلم إلى false

حدد التحديث وما في حكمه جيدة تقديم عقد تأمين على كمية مجهرية من الوقت ، ولكن العيانية المبلغ (مثلا ، المستخدم لديه البيانات تحميلها و لم يضغط " حفظ " يجب استخدام متفائل التزامن على النحو الوارد أعلاه.(والتي أعتقد دائما هو ذات التسمية المضللة - انها أكثر تشاؤما من الماضي الكاتب "يفوز بجائزة" ، التي عادة ما تكون البديل الوحيد نظر.)

@ مارك هاريسون :SQL Server لا يدعم هذه الجملة (SELECT ... FOR UPDATE).

SQL Server هو ما يعادل SELECT بيان تلميح UPDLOCK.

انظر كتب SQL Server عبر إنترنت للحصول على مزيد من المعلومات.

-إنشاء أول قدم (تحديث الوقت) إلى مخزن آخر تحديث السجل -عند أي مستخدم حدد تسجيل حفظ حدد الوقت ، قارن بين حدد الوقت و لا إذا( تحديث الوقت) > (تحديد الوقت) هذا يعني أن مستخدم آخر تحديث هذا السجل بعد تحديد سجل

وثمة خيار آخر هو اختبار القيم في سجل أن تقوم بتغيير هي لا تزال هي نفسها كما كانت عليه عندما كنت بدأت:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(عرض customer_nm المجال المستخدم التغييرات)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

لم يكن لديك لإضافة عمود جديد إلى الجدول الخاص بك (و يبقيه حتى الآن) ، ولكن لديك لإنشاء أكثر مطول البيانات SQL و تمر جديد و القديمة الحقول إلى الإجراء المخزن.

كما أن لديها ميزة أنك لست تأمين السجلات - لأننا نعلم جميعا أن يسجل في نهاية المطاف البقاء مؤمن عندما لا ينبغي أن يكون...

قاعدة البيانات سوف نفعل ذلك لك.انظر "تحديد ...تحديث" ، الذي يهدف فقط لهذا النوع من الشيء.وسوف تعطيك الكتابة قفل على الصفوف المحددة التي يمكنك ثم ارتكاب أو العودة.

معي أفضل طريقة عمود lastupdate (timetamp نوع البيانات).عند اختيار تحديث فقط مقارنة هذه القيمة آخر وقت مبكر من هذا الحل هو أنه يمكنك استخدام هذا العمود لتعقب البيانات في الوقت قد تغير.أعتقد أنه ليس من الجيد إذا كنت مجرد إنشاء كولوم مثل isLock من أجل التحقق من التحديث.

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