21-04-23, 08:16 AM
(21-04-23, 06:53 AM)foo كتب : استاذ عبدالله الدوسري لعل الاخ يقصد هذا الموضوع SQL Server When to use RowLOCK, UPDLOCK etc
الترجمة المبدئية
يضمن قفل مستوى الصف ROWLOCK أنه عندما يحصل المستخدم على الصف المحدث ، فلن يتم تعديله من قبل مستخدمين آخرين خلال هذا الوقت.
لذلك ، يمكن أن تضمن عمليات التأمين على مستوى الصف اتساق البيانات وتحسين تزامن عمليات البيانات.
ROWLOCK يخبر SQL Server لاستخدام أقفال على مستوى الصف فقط.
ليست لدي الخبرة للدخول في هذا الموضوع
فكرة جميله أخي foo ( لكن )
ROWLOCK لها إستخدامات أخرى، ولم يتم تصميمها لقفل السجل بالطريقة التي يريدها الأخ ابو محمد
ROWLOCK فعلاً تقوم بقفل السجل على مستوى السجل، تم تصميمها لقفل السجلات أثناء تنفيذ العمليات، مثل تنفيذ عمليات تحديث ثم يليها عمليات ادخال ثم يليها عمليات حذف، بهذا الشكل.
والهدف هو منع وصول المستخدم لهذة السجلات أثناء تنفيذ مثل هذا النوع من العمليات،
تخيل أنا موظف : ( البيانات الصحيحة كالتالي )
رصيد إجازاتي مثلاً : 50
عدد أيام الخروج : 0
قمت بالخروج في إجازة لمدة 50 يوم ( ولكنها لا تسجل مالياً إلى في نهاية كل شهر مثلاً )
بعض العمليات الإدارية مثلاً تقوم بها بالجملة لكل الموظفين وليست لموظف معين.
لأمور ماليه قام موظف الإدارة ببداء عمليات حسابية ( إجازة وحظور ورواتب وتأخير ...إلخ من الأمور الإدارية التي تؤثر على رصيد الإجازة مثلاً )
الموظف بداء العملية ...
أنا في نفس الوقت إستعلمت عن بياناتي .... ليس من المنطقي ان أجد رصيد إجازتي ( 0 ) بينما عدد أيام الخروج أيضاً ( 0 ).
أنا قمت بالإستعلام بينما هناك عملية تحدث في قاعدة البيانات لم تكتمل بعد، يمكن تأخذ دقائق أو 10 أو 30 دقيقة حتى تنتهي العملية، المهم.
هذة مجرد مشكلة بسيطة أنا أراها على شاشة الكمبيوتر.
المصيبة إذا كانت هناك أنظمة بنكية أو مالية أو أي شيء مهم، متصله قامت بالإستعلام وتعتمد على هذة البيانات، ( لن أشرح لك عن كمية الفوضى التي من الممكن أن تحدث )
لذلك جاء الحل بإستخدام ( ROWLOCK )
فقط يتم قفل السجلات المطلوبة عند بداء العملية وينتهي مع إنتهاء العملية، حتى تصبح البيانات منطقية، ومتكاملة. ، بالإضافة إلى إستخدام الـــ Transaction ، يتم تأمين صحة ودقة البيانات.
لأن الـــ Transaction لوحدة لا يمنع الوصول للبيانات.
لم يتم عمل ROWLOCK لقفل السجل بينما البيانات على الشاشة أمام المستخدم ، وممكن يطول الأمر إلى ساعة أو حتى أكثر والنافذة مفتوحة بإستخدام هذة الطريقة.
إذا إستخدمتها بهذة الطريقة ، تسمة ( bad practice ) ( سوء الممارسة ).
أفضل طريقة هي بإستخدام حقل زمني يبين إذا كان هذا السجل مقفل أو لا!!!
أول ما تفتح نافذة تحرير السجل ، مباشرتاً تقوم بإنشاء سجل إذا لم يكن موجود في جدول خاص ( مثلاً باسم : TblRowsLock ) يدل ( أن هذا السجل بالرقم الفلاني يتم تحريرة الأن بهذا الوقت والتاريخ بواسطة المستخدم الفلاني )
بعدها ( ما دامت النافذة مفتوحة ) في كل دقيقة يتم تحديث السجل نفسة السابق الموجود في جدول ( TblRowsLock ) بالوقت الجديد، ( بمعنى متى آخر مرة هذة النافذة قامت بقفل السجل )
ولا تنسى عند إغلاق نافذة التحرير ( إزالة الوقت الموجود في الجدول - TblRowsLock ) حتى تزيل القفل مباشرتاً، ولا تنتظر دقيقة لفتح السجل من جديد.
بعد إغلاق نافذة التحرير :
السجل الموجود في جدول ( TblRowsLock ) سيبقى، لكن النافذة اغلقت ولن يتم تحديث الوقت في السجل.
وبذلك عندما تريد فتح نافذة التحرير، يجب أن تسأل عن الجدول ( TblRowsLock ) إذا كان يحتوي على سجل قفل لهذا السجل المراد تحريرة ، أن لم يجد فهذا يعني لا يوجد قفل، أن وجد سجل ، يتم مقارنة حقل ( آخر تاريخ للقفل ) في جدول ( TblRowsLock ) مع الوقت الحالي، إذا كانت أكبر من ( 60 ثانية مثلا ) ، هذا يدل على أنه لايوجد هناك احد يقوم بتحرير هذا السجل، إذا كانت أقل من ( 60 ثانية ) فهذا يدل على أنه هناك نافذة تحرير مفتوحة الآن.
والجميل في هذة الطريقة انها بسيطة، ولن يتم قفل السجل حتى عن طريق الخطأ لو تم فتح نافذة التحرير، وتجمد النظام بالكامل أو تم إغلاق الجهاز سيرجع السجل كما كان لأن الوقت هو العامل الأساسي لعملية القفل، بعد دقيقة من إغلاق نافذة التحرير.
