easyDelphi Q&A
+3 تصويتات
64 مشاهدات
هل يفضل فتح Transaction يعني عمل BEGIN قبل البدء باستدراج معلومات من قواعد البيانات، بدون عمل تعديل على البيانات، فقط SELECT ؟

السؤال  لأغلب قواعد البيانات مثل MySQL و SQLite أو Postgres مثلا او FirebirdSQL او MS SQL Server ألخ
سُئل في تصنيف Database بواسطة (9,270 نقاط) | 64 مشاهدات
 

3 إجابة

0 تصويتات
أفضل إجابة
الاجابة بانك لا تحتاج إلى فتح Trasnaction لعملية القراءة، غير صحيح، مع انها صحيحة.

فعليا انت بحاجة إلى فتح Trasnaction لكنك لن تفتح واحد لانه قاعدة البيانات ستقوم ذلك بالنيابة عنها، لن يتم تنفيذ اي استعلام او عملية بدون واحد مفتوح، فاذا لم يكن استعلامك ضمن كتلة تعليمات بدأت بفتح transaction، قاعدة البيانات ستتولى ذلك.

قاعدة البيانات بحاجة ال Trasnaction  لانه ينظم عملية القراءة، فانت لا يجب ان تقرأ البيانات الجاري تخزينها قبل عملية ال commit (الا بخيار خاص له)، ايضا لا يجب ان تقرا التعديلات التي حدثت خلال عملية القراءة، لانه اثناء تنفيذ الاستعلام قاعدة البيانات مجبرة على اخذ لقطة للبيانات snapshot و ارسال النتائج، اي انها لن تأخذ التعديلات التي حدثت مع مستخدم اخر اثناء سحب بيانات الاستعلام، لضمان تراص المعلومات.

لكن هل يفضل ان تقوم انت بذلك طالما قاعدة البيانات ستفعلها؟

ذلك حسب طبيعة الاستعلام، اذا كان ضربة سريعة لقراءة بعض او سجل واحد، فلا داعي لفتحه و ارمي العبيءعلى قاعدة البيانات.

لكن ماذا لو كان استعلامك يستبعه استعلام اخر مرتبط به، مثلا الاول يجلب سجل من جدول master و الثاني يجلب ال details
و بين هذين الاستعلامين جاء مستخدم اخر و عدل ال details ، هنا ستأتي البيانات غير متوافقة مع بعض، ربما يحوي ال master معلومات (كالعدد و المجموع) عن التفاصيل التي ستأتي فيما بعد مختلفة نتيجة التعديل.

في هذه الحالة لا يجب ان تتكل على قاعدة البيانات، و انت مجبر على فتح transaction من نوع خاص serializable او record version بيحيث يأخذ لقطة عن كامل قاعدة البيانات، لن يمنع الأخيرن من التعديل، لكنه سيضع تعديلاتهم في سجل خاص log او journal حتى ينتهي استعلامتك و transaction الخاص بها و تعمل commit
ال commit تقوم بانهاء ال transaction وتسمح للتعديلات التالية باخذ مجراها.
إذا ال commit لا تستعمل فقط مع التعديل.

الخلاصة، نعم يجب فتح transaction لل select ، يمكن تركها لقاعدة البيانات او عملها بيدك، و في حالة تعدد الاستعلامات، اعملها بيدك أفضل.
تم الرد عليه بواسطة (9,270 نقاط)
مختارة بواسطة
+3 تصويتات
لا يفضل ذلك استاذ زاهر،  لأن ما يهم في transaction هو rollback و commit بعد تغيير معين في DB، ادا كنت ستقوم بجلب البيانات فقط فلن يكون لها منفعة هنا الا في حالة select into
تم الرد عليه بواسطة (1,130 نقاط)
عُدل بواسطة
–2 تصويتات

انظر المقال التالي  ارجو ان يكون ذا فائده

Is it a bad practice to always create a transaction?

تم الرد عليه بواسطة (640 نقاط)

اسئلة متعلقة

+3 تصويتات
1 إجابة
سُئل أغسطس 11 في تصنيف Database بواسطة Amar Gozim (6,220 نقاط) | 88 مشاهدات
+3 تصويتات
1 إجابة
سُئل سبتمبر 21 في تصنيف SQL Server بواسطة Yamada Fakir (1,250 نقاط) | 81 مشاهدات
+4 تصويتات
2 إجابة
سُئل أغسطس 19 في تصنيف SQL Server بواسطة Yamada Fakir (1,250 نقاط) | 72 مشاهدات
+2 تصويتات
1 إجابة
+4 تصويتات
2 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

248 سؤال
450 إجابة
790 تعليق
144 مستخدم