ما هو الهدف من "التراجع عن الصفقة named_transaction"?
-
06-07-2019 - |
سؤال
لقد قرأت من خلال MSDN على التراجع عن الصفقة و تداخل المعاملات.حين أرى نقطة ROLLBACK TRANSACTION savepointname
, أنا لا أفهم ROLLBACK TRANSACTION transactionname
.
- أنها لا تعمل إلا عند
transactionname
هو الأبعد الصفقة 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.أول إدراج).
على مثال عملي على نقطة حفظ ترى استثناء معالجة المعاملات المتداخلة.