سؤال

إذا قمت بإنشاء إجراء مخزن في SQL وقمت باستدعائه (EXEC spStoredProcedure) ضمن معاملة البداية/النهاية، هل يقع هذا الإجراء المخزن الآخر أيضًا ضمن المعاملة؟

لم أكن أعرف ما إذا كان الأمر يعمل مثل المحاولة/الالتقاط في C#.

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

المحلول

نعم، <م> كل شيء ما تفعله بين عملية بيغن والالتزام (أو الاستعادة) هو جزء من الصفقة.

نصائح أخرى

ويبدو كبيرا، وذلك بفضل حفنة. انتهى بي الأمر تفعل شيئا مثل هذا (لأنني على 05)

    BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH

وأعتقد في MS SQL خادم ان تنفيذ الإجراء المخزن يحدث في هذه الصفقة، ولكن كن حذرا جدا مع هذا. إذا كنت قد تداخل المعاملات (أي معاملة خارج الإجراء المخزن ومعاملة مختلفة داخل الإجراء المخزن)، وهو التراجع سيؤثر ALL المعاملات، وليس فقط أقرب الصفقة إرفاق.

وكما ذكر كريس، يجب أن تكون حذرا حول المتداول المعاملة مرة أخرى.

وعلى وجه التحديد ما يلي:

IF @@TRANCOUNT > 0 ROLLBACK

وليست دائما على ما تريد. هل يمكن أن تفعل شيئا من هذا القبيل

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

وبهذه الطريقة، بروك الدعوة يمكن أن تفقد قيمة الإرجاع من الإجراء المخزن وتحديد ما إذا كان يريد ارتكاب أي حال أو مواصلة فقاعة يصل الخطأ.

والسبب هو أن "ارتكاب" سيتم فقط إنقاص مكافحة معاملتك. بمجرد أن التناقصات العداد الصفقة إلى الصفر، ثم فعلي ارتكاب سيحدث.

مثل كريس و جوامع كما ذكرنا، عليك توخي الحذر عند التعامل مع المعاملات المتداخلة.هناك مجموعة مقالات جيدة جدًا في موضوع المعاملات كتبها دون بيترسون على مركز خادم SQLl، أنصح بقراءة هذه:

هما هنا:

نعم، يتم تضمين كافة المكالمات الإجراء المخزن المتداخلة في نطاق المعاملة. إذا كنت تستخدم SQL Server 2005 أو أكثر، يمكنك استخدام حاول ... القبض أيضا. هنا المزيد من التفاصيل في هذا الشأن.

و @كريس، لم أكن أعرف ذلك.

عند غوغلينغ لمزيد من المعلومات، جئت عبر هذا - يمكنك ضبط "savepoints"، والتي يمكن التراجع إلى دون التراجع المعاملة بالكامل.

ويمكن أن تكون مفيدة في هذه الحالة.

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