سؤال

لنفترض أن لدي إجراء مخزنًا يدير معاملته الخاصة

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

إذا قمت باستدعاء هذا proc من معاملة موجودة، فيمكن لـ proc استرجاع المعاملة الخارجية.

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

كيف يمكنني تحديد نطاق المعاملة بشكل صحيح ضمن الإجراء المخزن، بحيث لا يؤدي الإجراء المخزن إلى التراجع عن المعاملات الخارجية؟

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

المحلول

ربما يختلف بناء الجملة للقيام بذلك حسب قاعدة البيانات.ولكن في Transact-SQL ما تفعله هو التحقق من @@TRANCOUNT لمعرفة ما إذا كنت في معاملة.إذا كنت كذلك، فأنت تريد إنشاء نقطة حفظ، وفي النهاية يمكنك فقط المرور عبر نهاية الوظيفة (معتقدًا أن الالتزام أو التراجع سيحدث لاحقًا) أو العودة إلى نقطة الحفظ الخاصة بك.

راجع وثائق Microsoft على نقاط الحفظ للمزيد من.

يعد دعم نقاط الحفظ منتشرًا على نطاق واسع إلى حد ما، لكنني أعتقد أن الآلية (على افتراض وجود واحدة) لاكتشاف أنك حاليًا في معاملة ما ستختلف قليلاً.

نصائح أخرى

استخدم @@trancount لمعرفة ما إذا كنت مشتركًا بالفعل في معاملة عند الدخول

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