المعاملات المحددة بشكل صحيح في Stored Procs
-
01-07-2019 - |
سؤال
لنفترض أن لدي إجراء مخزنًا يدير معاملته الخاصة
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 لمعرفة ما إذا كنت مشتركًا بالفعل في معاملة عند الدخول