المعاملات المستقلة في Oracle PL / SQL

⚡ ملخص ذكي

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

  • 💾 يقترف: يجعل جميع تغييرات DML المعلقة دائمة، وينهي المعاملة، ويحرر الأقفال، ويمحو كل نقطة حفظ.
  • ↩️ التراجع: يتراجع عن التغييرات المعلقة، إما عن المعاملة بأكملها أو عن نقطة حفظ محددة.
  • 📌 حفظ نقطة: يحدد نقطة داخل المعاملة بحيث يمكن لعملية ROLLBACK TO اللاحقة التراجع عن جزء فقط من العمل.
  • 🔀 المعاملة المستقلة: تتيح توجيهات PRAGMA AUTONOMOUS_TRANSACTION للبرنامج الفرعي تنفيذ عملية الالتزام أو التراجع عنها بمفرده.
  • 🧾 استخدم حالات: تُناسب المعاملات المستقلة عمليات التدقيق وتسجيل الأخطاء التي يجب أن تستمر حتى في حالة التراجع عن العمل الرئيسي.
  • 🤖 مساعدة الذكاء الاصطناعي: تقوم المساعدات المدعومة بالذكاء الاصطناعي مثل GitHub Copilot بصياغة كتل COMMIT و ROLLBACK و PRAGMA وتحديد الالتزامات المفقودة.

المعاملات المستقلة في Oracle PL/SQL مع COMMIT و ROLLBACK

ما هي بيانات 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.

مثال على معاملة مستقلة: تنفيذ كتلة متداخلة بينما تتراجع المعاملة الرئيسية. Oracle PL / SQL

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 في القسم التصريحي
تأثير التراجع عن الأصل التغييرات تضيع يتم الاحتفاظ بالتغييرات المستقلة الملتزمة
الاستخدام النموذجي منطق الأعمال الأساسي التدقيق وتسجيل الأخطاء

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

الأسئلة الشائعة

Oracle يُصدر الخطأ ORA-06519 ويتراجع عن العمل المستقل. يجب أن تنتهي كل معاملة مستقلة بتأكيد صريح أو تراجع قبل عودة التحكم إلى المعاملة الرئيسية، لأنه لا يُسمح إلا بمعاملة نشطة واحدة في كل مرة.

ليس بشكل مباشر. لا يمكن للمُشغِّل العادي إصدار أمرَي COMMIT أو ROLLBACK. يسمح تعريف المُشغِّل، أو الإجراء الذي يستدعيه، باستخدام PRAGMA AUTONOMOUS_TRANSACTION، بتنفيذ تغييراته الخاصة بشكل مستقل عن العبارة التي أطلقت المُشغِّل.

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

نعم. كل عبارة DDL، مثل CREATE أو ALTER أو DROP، تُصدر أمر COMMIT ضمنيًا قبل تنفيذها وبعدها. يتم تنفيذ أي عمليات DML معلقة في الجلسة تلقائيًا، لذا لا يمكن التراجع عن عبارة DDL بعد ذلك.

يمكن للكتلة المستقلة استدعاء كتلة أخرى، وتدير كل كتلة عملية الالتزام أو التراجع الخاصة بها. Oracle يحدد عدد المعاملات النشطة في وقت واحد من خلال معلمة التهيئة TRANSACTIONS، لذلك قد يفشل التداخل العميق للغاية للكتل المستقلة.

لا. عملية COMMIT تجعل التغييرات دائمة، وتُحرر الأقفال، وتمحو نقاط الحفظ، لذا لا يمكن التراجع عنها باستخدام ROLLBACK. لعكس البيانات المُلتزم بها، يجب تنفيذ أوامر DML جديدة. استخدم SAVEPOINT و ROLLBACK TO للتراجع الجزئي قبل الالتزام.

نعم. مساعد الطيار جيثب مسودات منطق COMMIT و ROLLBACK، وكتل SAVEPOINT، وإجراءات PRAGMA AUTONOMOUS_TRANSACTION من تعليق. Revانظر إلى موضع الالتزام ومعالجة الأخطاء، لأن الالتزام في غير موضعه يمكن أن يفسد حدود المعاملات.

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

تلخيص هذه التدوينة بـ: