سؤال

لقد قرأت من خلال MSDN على التراجع عن الصفقة و تداخل المعاملات.حين أرى نقطة ROLLBACK TRANSACTION savepointname, أنا لا أفهم ROLLBACK TRANSACTION transactionname.

  1. أنها لا تعمل إلا عند transactionname هو الأبعد الصفقة
  2. ROLLBACK دائما بالتراجع عن الصفقة برمتها "المكدس" ، ما عدا في حالة savepointname

في الأساس, كما قرأت الوثائق, إلا في حالة وجود نقطة حفظ ، ROLLBACK تتحرك مرة أخرى جميع المعاملات (إلى @@TRANCOUNT=0).الفرق الوحيد أنني يمكن أن نرى هذا مقتطف:

إذا التراجع الصفقة transaction_name البيان باستخدام اسم الخارجي معاملة يتم تنفيذها في أي مستوى من مجموعة متداخلة المعاملات ، كل من المعاملات المتداخلة يتم إرجاع.إذا التراجع العمل أو التراجع بيان المعاملة دون transaction_name المعلمة يتم تنفيذها في أي مستوى من مجموعة متداخلة الصفقة, لفات كافة المعاملات المتداخلة ، بما في ذلك الأبعد الصفقة.

من القراءة ، وهذا يوحي لي أن دحر اسمه الصفقة (التي يجب أن يكون اسم الأبعد الصفقة), فقط المعاملات المتداخلة سوف يتم التراجع.هذا من شأنه أن يعطي بعض معنى دحر اسمه الصفقة.لذا إعداد الاختبار:

CREATE TABLE #TEMP (id varchar(50))

INSERT INTO #TEMP (id) VALUES ('NO')
SELECT id AS NOTRAN FROM #TEMP
SELECT @@TRANCOUNT AS NOTRAN_TRANCOUNT

BEGIN TRAN OUTERTRAN

INSERT INTO #TEMP (id) VALUES ('OUTER')
SELECT id AS OUTERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS OUTERTRAN_TRANCOUNT

BEGIN TRAN INNERTRAN

INSERT INTO #TEMP (id) VALUES ('INNER')
SELECT id AS INNERTRAN FROM #TEMP
SELECT @@TRANCOUNT AS INNERTRAN_TRANCOUNT

ROLLBACK TRAN OUTERTRAN

IF @@TRANCOUNT > 0 ROLLBACK TRAN

SELECT id AS AFTERROLLBACK FROM #TEMP
SELECT @@TRANCOUNT AS AFTERROLLBACK_TRANCOUNT

DROP TABLE #TEMP

النتائج في (كل "X row(s) المتضررة من" الاشياء إزالة)

NOTRAN
--------------------------------------------------
NO

NOTRAN_TRANCOUNT
----------------
0

OUTERTRAN
--------------------------------------------------
NO
OUTER

OUTERTRAN_TRANCOUNT
-------------------
1

INNERTRAN
--------------------------------------------------
NO
OUTER
INNER

INNERTRAN_TRANCOUNT
-------------------
2

AFTERROLLBACK
--------------------------------------------------
NO

AFTERROLLBACK_TRANCOUNT
-----------------------
0

علما أن هناك لا فرق إلى إخراج عندما أقوم بتغيير

ROLLBACK TRAN OUTERTRAN

ببساطة

ROLLBACK TRAN

إذن ما هو الهدف من ROLLBACK TRANSACTION named_transaction?

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

المحلول

حفظ النقاط تماما كما يوحي الاسم:'حفظ النقاط في تسلسل السجل.تسلسل السجل هو خطية دائما.إذا كنت العودة الى نقطة حفظ يمكنك التراجع كل شيء معاملتك هل بين السجل الحالي وضع نقطة حفظ.النظر في المثال الخاص بك:

LSN 1: BEGIN TRAN OUTERTRAN
LSN 2: INSERT INTO ...
LSN 3: BEGIN TRAN INNERTRAN
LSN 4: INSERT INTO ...
LSN 5: ROLLBACK TRAN OUTERTRAN

في تسجيل رقم التسلسل (LSN) 1 OUTERTRAN نقطة حفظ يتم إنشاؤه.أول إدراج يخلق LSN 2.ثم INNERTRAN يخلق نقطة حفظ مع LSN 3.الثانية إدراج يخلق جديد LSN, 4.التراجع OUTERTRAN ما يعادل 'التراجع سجل حتى LSN 1'.لا يمكنك 'تخطي' أجزاء من السجل ، لذلك يجب أن تراجع كل عملية تسجيل حتى LSN 1 (عند نقطة حفظ OUTERTRAN خلق) هو ضرب.

من ناحية أخرى إذا كان في آخر العملية سوف مسألة التراجع INNERTRAN المحرك سوف لفة إلى الوراء حتى LSN 3 (حيث 'INNERTRAN' نقطة حفظ تم إدراجها في السجل) وبالتالي الحفاظ على LSN 1 و الا 2 (ie.أول إدراج).

على مثال عملي على نقطة حفظ ترى استثناء معالجة المعاملات المتداخلة.

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