المعاملات المستقلة في Oracle PL / SQL
⚡ ملخص ذكي
بيانات التحكم في المعاملات في Oracle تُحدد أوامر PL/SQL، وهي COMMIT وROLLBACK وSAVEPOINT، ما إذا كانت تغييرات DML المعلقة ستُحفظ أم تُتجاهل. وتعمل المعاملة المستقلة كبرنامج فرعي مستقل يُنفذ عملية الالتزام أو التراجع بشكل منفصل عن المعاملة الرئيسية.

ما هي بيانات TCL في PL/SQL؟
يرمز TCL إلى بيانات التحكم في المعاملات. تقوم هذه البيانات إما بحفظ المعاملات المعلقة أو التراجع عنها. وتلعب دورًا حيويًا، لأنه ما لم يتم حفظ المعاملة، فإن التغييرات التي تُجرى من خلالها ستُلغى. بيانات DML لن يتم تخزينها بشكل دائم في قاعدة البيانات. فيما يلي عبارات TCL المختلفة في PL / SQL.
| ملخص الحساب | الوصف |
|---|---|
| ارتكب | يحفظ جميع المعاملات المعلقة. |
| رول باك | يتجاهل جميع المعاملات المعلقة. |
| حفظ نقطة | يُنشئ نقطة في المعاملة يمكن عندها التراجع لاحقًا. |
| العودة إلى | يتجاهل جميع المعاملات المعلقة حتى نقطة الحفظ المحددة. |
ستكتمل المعاملة في الحالات التالية:
- عند إصدار أي من البيانات المذكورة أعلاه (باستثناء SAVEPOINT).
- عند إصدار عبارات DDL (عبارات DDL هي عبارات الالتزام التلقائي).
- عند إصدار عبارات DCL (عبارات DCL هي عبارات الالتزام التلقائي).
استخدام نقطة الحفظ والتراجع إلى
يُعرّف الجدول أعلاه بوظيفتي SAVEPOINT و ROLLBACK TO، وهما معًا يمنحانك تحكمًا جزئيًا في المعاملة. تُشير SAVEPOINT إلى نقطة مُسماة داخل المعاملة الحالية. أما ROLLBACK TO اللاحقة، فتُلغي جميع التغييرات التي أُجريت بعد نقطة الحفظ هذه، مع الحفاظ علىping العمل الذي تم إنجازه قبل ذلك سليماً.
يُعد هذا مفيدًا عندما تقوم معاملة طويلة بتنفيذ عدة عمليات SQL إذا فشلت الخطوات، فإن الخطوة الأخيرة فقط هي التي تفشل. بدلاً من إلغاء العملية بأكملها، يمكنك الرجوع إلى آخر نقطة حفظ سليمة ومتابعة العملية.
بناء الجملة:
SAVEPOINT <savepoint_name>; -- one or more DML statements ROLLBACK TO <savepoint_name>;
أهم النقاط التي يجب تذكرها بشأن نقاط الحفظ:
- توجد نقطة الحفظ فقط داخل المعاملة الحالية؛ حيث أن عملية الالتزام أو التراجع الكامل يمحو كل نقطة حفظ.
- عندما تعود إلى نقطة حفظ، يتم مسح أي نقاط حفظ تم إنشاؤها بعد ذلك، ولكن يتم الاحتفاظ بنقطة الحفظ التي تعود إليها.
- لا يؤدي ROLLBACK TO إلى إنهاء المعاملة؛ فالتغييرات التي تم إجراؤها قبل نقطة الحفظ تبقى معلقة حتى تقوم بتنفيذ COMMIT أو ROLLBACK.
- إذا قمت بإعادة استخدام اسم نقطة حفظ، فإن نقطة الحفظ الأحدث تنقل العلامة إلى الموضع الأحدث.
لأن ROLLBACK TO يترك المعاملة مفتوحة، فإنك لا تزال تقرر في النهاية ما إذا كنت تريد COMMIT التغييرات المتبقية أو تجاهلها باستخدام ROLLBACK كامل.
ما هي المعاملة المستقلة
في لغة PL/SQL، تُسمى جميع التعديلات التي تُجرى على البيانات "معاملة". تُعتبر المعاملة مكتملة عند تطبيق أمر حفظ أو حذف عليها. في حال عدم تطبيق أي أمر حفظ أو حذف، لا تُعتبر المعاملة مكتملة، ولن تُحفظ التعديلات التي أُجريت على البيانات بشكل دائم على الخادم.
بشكل افتراضي، يتعامل PL/SQL مع جميع التعديلات التي تُجرى خلال الجلسة كمعاملة واحدة، ويؤثر حفظ هذه المعاملة أو إلغاؤها على جميع التغييرات المعلقة في الجلسة. أما المعاملة المستقلة فتتيح للمطور إمكانية إجراء التغييرات في معاملة منفصلة وحفظها أو إلغائها دون التأثير على معاملة الجلسة الرئيسية.
- يمكن تحديد المعاملة المستقلة على مستوى البرنامج الفرعي.
- لجعل أي برنامج فرعي في حالة العمل في معاملة مختلفة، يجب إعطاء الكلمة المفتاحية PRAGMA AUTONOMOUS_TRANSACTION في القسم التصريحي من تلك الكتلة.
- هذا يوجه المترجم للتعامل مع هذا كمعاملة منفصلة، ولن ينعكس الحفظ أو التخلص داخل هذه الكتلة في المعاملة الرئيسية.
- يُعد إصدار أمر COMMIT أو ROLLBACK إلزاميًا قبل مغادرة هذه المعاملة المستقلة والعودة إلى المعاملة الرئيسية، لأنه في أي وقت لا يمكن أن تكون هناك سوى معاملة واحدة نشطة.
- لذلك بمجرد بدء معاملة مستقلة، يجب حفظها وإكمالها قبل أن يتمكن التحكم من العودة إلى المعاملة الرئيسية.
بناء الجملة:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION; . BEGIN <execution_part> [COMMIT|ROLLBACK] END; /
في الصيغة المذكورة أعلاه، تم جعل الكتلة معاملة مستقلة.
مثال 1: في هذا المثال، سنفهم كيف تعمل المعاملة المستقلة.
تُظهر لقطة الشاشة أدناه مثالًا على هذه المعاملة التلقائية ومخرجاتها في Oracle.
DECLARE l_salary NUMBER; PROCEDURE nested_block IS PRAGMA autonomous_transaction; BEGIN UPDATE emp SET salary = salary + 15000 WHERE emp_no = 1002; COMMIT; END; BEGIN SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('Before Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('Before Salary of 1002 is'|| l_salary); UPDATE emp SET salary = salary + 5000 WHERE emp_no = 1001; nested_block; ROLLBACK; SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001; dbms_output.put_line('After Salary of 1001 is'|| l_salary); SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002; dbms_output.put_line('After Salary of 1002 is '|| l_salary); end;
الناتج
Before:Salary of 1001 is 15000 Before:Salary of 1002 is 10000 After:Salary of 1001 is 15000 After:Salary of 1002 is 25000
Code التفسير:
- Code السطر 2: تعريف l_salary كرقم.
- Code السطر 3: إعلان إجراء nested_block.
- Code السطر 4: جعل إجراء nested_block عبارة عن معاملة مستقلة (AUTONOMOUS_TRANSACTION).
- Code الأسطر 7-9: زيادة راتب الموظف رقم 1002 بمقدار 15000.
- Code السطر 10: إتمام المعاملة المستقلة.
- Code الأسطر 13-16: طباعة تفاصيل رواتب الموظفين 1001 و 1002 قبل التغييرات.
- Code الأسطر 17-19: زيادة راتب الموظف رقم 1001 بمقدار 5000.
- Code السطر 20: استدعاء إجراء nested_block.
- Code السطر 21: تجاهل المعاملة الرئيسية.
- Code الأسطر 22-25: طباعة تفاصيل رواتب الموظفين 1001 و 1002 بعد التغييرات.
لم يظهر ارتفاع راتب الموظف رقم 1001 لأن العملية الرئيسية قد تم تجاهلها. أما ارتفاع راتب الموظف رقم 1002 فقد ظهر لأن هذه العملية أصبحت عملية منفصلة وتم حفظها في النهاية.
لذلك بغض النظر عن الحفظ أو الرفض في المعاملة الرئيسية، يتم حفظ التغييرات في المعاملة المستقلة دون التأثير على المعاملة الرئيسية.
متى يتم استخدام المعاملات المستقلة
تُعدّ المعاملات المستقلة فعّالة، لذا من المفيد معرفة متى يكون استخدامها مناسبًا. خصصها للمهام التي يجب أن تنجح أو تفشل بشكل مستقل عن المعاملة الرئيسية، وليس لمنطق العمل الأساسي. تشمل حالات الاستخدام الشائعة ما يلي:
- تسجيل التدقيق: سجل من قام بتغيير البيانات الحساسة، ومتى، والقيم القديمة والجديدة، بحيث يبقى السجل حتى في حالة التراجع عن المعاملة الرئيسية.
- تسجيل الخطأ: اكتب سجل خطأ داخل استثناء قم بمعالجة العملية وتأكيدها، بحيث يتم الاحتفاظ بتفاصيل التشخيص أثناء تجاهل المعاملة الفاشلة.
- العدادات والإحصائيات: قم بزيادة عداد الاستخدام أو عدد مرات الوصول التي يجب أن تستمر بغض النظر عن نتيجة المتصل.
- الالتزام داخل المشغل: لا يمكن للمحفز إصدار أمر COMMIT بشكل مباشر؛ فالمعاملة المستقلة هي الطريقة الوحيدة المدعومة للقيام بذلك.
تجنّب استخدام المعاملات المستقلة للتحديثات العادية التي يجب أن تتطابق مع مصير المعاملة الرئيسية. فالإفراط في استخدامها قد يُخفي البيانات خلف عمليات تثبيت مستقلة، مما يُصعّب عملية تصحيح الأخطاء. وكقاعدة عامة، يجب أن تنتهي كل كتلة مستقلة بعملية تثبيت صريحة (COMMIT) أو تراجع (ROLLBACK).
المعاملات المستقلة مقابل المعاملات العادية
يكمن الفرق بين المعاملة العادية (الرئيسية) والمعاملة المستقلة في النطاق والاستقلالية. يقارن الجدول أدناه بينهما.
| البعد | معاملة منتظمة | المعاملات المستقلة |
|---|---|---|
| مجال | يشارك معاملة جلسة واحدة | يتم تشغيلها كمعاملة فرعية منفصلة |
| تأثير الالتزام / التراجع | يؤثر على جميع تغييرات الجلسة المعلقة | يؤثر فقط على الكتلة المستقلة |
| إعلان | السلوك الافتراضي | PRAGMA AUTONOMOUS_TRANSACTION في القسم التصريحي |
| تأثير التراجع عن الأصل | التغييرات تضيع | يتم الاحتفاظ بالتغييرات المستقلة الملتزمة |
| الاستخدام النموذجي | منطق الأعمال الأساسي | التدقيق وتسجيل الأخطاء |
على عكس المعتاد كتلة متداخلةبينما تشترك التغييرات في الكتلة الأصلية دائمًا في نتيجة المعاملة التي تحتويها، فإن الكتلة المستقلة تعمل بشكل مستقل. يساعدك فهم هذا الفرق على تحديد متى يجب أن تكون الكتلة مستقلة ومتى يجب أن تشارك نتيجة المعاملة الرئيسية.

