تنفيذ إجراء مخزن داخل بداية/إنهاء المعاملة
-
05-07-2019 - |
سؤال
إذا قمت بإنشاء إجراء مخزن في 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"، والتي يمكن التراجع إلى دون التراجع المعاملة بالكامل.
ويمكن أن تكون مفيدة في هذه الحالة.