متى تبدأ المعاملات عند استخدام القضبان (المريحة).

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

سؤال

فهل يكون الفعل المطمئن كله تحت معاملة واحدة شاملة؟وهذا يعني أنه إذا قمت بإثارة خطأ في التحقق من الصحة أو عمليات الاسترجاعات في أي وقت أثناء معالجة عملية التحديث أو الحذف أو الإنشاء، فهل يتم أيضًا التراجع عن كل عملية قاعدة بيانات ربما قمت بها في عمليات الاسترجاعات السابقة؟بإيجاز، هل يؤدي ظهور خطأ عند أي رد اتصال أو تحقق من الصحة إلى عدم حدوث أي تغيير على الإطلاق في قاعدة البيانات لهذا الإجراء الفعل؟

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

المحلول

فهل يكون الفعل المطمئن كله تحت معاملة واحدة شاملة؟

لا

إذا قمت بإثارة خطأ في التحقق من الصحة أو عمليات الاسترجاعات في أي وقت أثناء معالجة عملية UPDATE أو DELETE أو CREATE، فهل يتم أيضًا التراجع عن كل عملية قاعدة بيانات ربما قمت بها في عمليات الاسترجاعات السابقة؟

لا.

هل يؤدي ظهور خطأ في أي رد اتصال أو تحقق من الصحة إلى عدم حدوث أي تغيير على الإطلاق في قاعدة البيانات لهذا الإجراء الفعل؟

لا.

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

نصائح أخرى

بشكل افتراضي، لا يوجد كود قاعدة بيانات مكتوب داخل المعاملة، عليك أن تخبرها بذلك في الكود.

def create
  Model.transaction do
    Model.create!(params[:model])
    Model.association.create!(params[:association])
  end
  rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
    flash[:notice] = "That record could not be saved."
    render :action => "new"
end

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

إذا لم تقم بإنقاذ الإجراء، فستتم إعادة توجيهك إلى (على ما أعتقد) 405.html في دليلك العام إذا كان موجودًا.

تنتقل بعض الطرق (الإنشاء والتدمير) إلى قاعدة البيانات على الفور.تتم المعاملات باستخدام أسلوب المعاملة على الفئات المشتقة من ActiveRecord كما يلي:

Student.transaction do
  Course.transaction do
    course.enroll(student)
    student.units += course.units
  end
end

(هذا المثال مخصص لقواعد بيانات متعددة.بالنسبة لقاعدة بيانات واحدة، تحتاج إلى معاملة واحدة فقط.)

يمكنك بعد ذلك التراجع عن هذه المعاملات، ويتم نشر الاستثناءات التي تم طرحها داخل المعاملة بعد التراجع.

هذا يعتمد على وجود معاملات في قاعدة البيانات.

ملحوظة:يتم حفظ وتدمير ملفوفة في المعاملات.

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