नहीं SAVE TRANSACTION
। मुझे इसका उपयोग करने का मामला कभी नहीं मिला। मुझे पता है कि कुछ लोग इसे पसंद करते हैं, लेकिन मैंने जो भी काम किया है, उसमें किसी भी जगह मैंने कभी भी किसी भी नेस्टेड स्तर के भीतर होने वाली त्रुटि की धारणा निहित है कि जो भी काम पहले से किया गया था वह अमान्य था। SAVE TRANSACTION
आप का उपयोग करके केवल राज्य में वापस लौट रहे हैं, इस पूर्व प्रक्रिया को बुलाया जा रहा है, मौजूदा प्रक्रिया को अन्यथा वैध माना जाएगा।
यदि आप अधिक विवरण चाहते हैं SAVE TRANSACTION
, तो कृपया इस उत्तर में दी गई जानकारी देखें:
जब एक संग्रहीत कार्यविधि से 3 संग्रहीत कार्यविधियाँ प्रारंभ की जाती हैं तो रोलबैक कैसे करें
SAVE TRANSACTION
इसके साथ एक और समस्या इसके व्यवहार की बारीकियों की है, जैसा कि SAVE TRANSACTION के लिए MSDN पेज में दिया गया है (जोर दिया गया है :)
किसी लेनदेन में डुप्लीकेट सेवपॉइंट नामों की अनुमति है, लेकिन एक रोलबैक ट्रांजेक्शन स्टेटमेंट जो कि सेवपॉइंट नाम को निर्दिष्ट करता है, केवल उस नाम का उपयोग करके ट्रांजैक्शन को सबसे हाल ही में सेव ट्रांजेक्शन में वापस लाएगा।
मतलब, आपको प्रत्येक संग्रहीत कार्यविधि में प्रत्येक सहेजें बिंदु को देने के लिए बहुत सावधान रहने की आवश्यकता है, जो सभी संग्रहीत कार्यविधियों में सभी सहेजें बिंदुओं के बीच अद्वितीय है। निम्नलिखित उदाहरण इस बिंदु को चित्रित करते हैं।
यह पहला उदाहरण दिखाता है कि जब आप सहेजें बिंदु नाम का पुन: उपयोग करते हैं तो क्या होता है; केवल सबसे निचले स्तर का सेव प्वाइंट रोल-बैक है।
IF (OBJECT_ID(N'tempdb..#SaveTranTestA') IS NOT NULL)
BEGIN
DROP TABLE #SaveTranTestA;
END;
CREATE TABLE #SaveTranTestA (SomeVal INT NOT NULL);
BEGIN TRAN; -- start level 1
SAVE TRANSACTION MySavePoint;
SELECT @@TRANCOUNT AS [TranCount]; -- 1
INSERT INTO #SaveTranTestA (SomeVal) VALUES (100);
BEGIN TRAN; -- start level 2
SAVE TRANSACTION MySavePoint;
SELECT @@TRANCOUNT AS [TranCount]; -- 2
INSERT INTO #SaveTranTestA (SomeVal) VALUES (200);
COMMIT; -- exit level 2
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestA;
-- 100
-- 200
ROLLBACK TRANSACTION MySavePoint; -- error occurred; undo actions up to this point
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestA;
-- 100
COMMIT; -- exit level 1
SELECT @@TRANCOUNT AS [TranCount]; -- 0
SELECT * FROM #SaveTranTestA;
-- 100
यह दूसरा उदाहरण दिखाता है कि जब आप अद्वितीय सहेजें बिंदु नाम का उपयोग करते हैं तो क्या होता है; वांछित स्तर का सेव प्वाइंट लुढ़का हुआ है।
IF (OBJECT_ID(N'tempdb..#SaveTranTestB') IS NOT NULL)
BEGIN
DROP TABLE #SaveTranTestB;
END;
CREATE TABLE #SaveTranTestB (SomeVal INT NOT NULL);
BEGIN TRAN; -- start level 1
SAVE TRANSACTION MySavePointUno;
SELECT @@TRANCOUNT AS [TranCount]; -- 1
INSERT INTO #SaveTranTestB (SomeVal) VALUES (100);
BEGIN TRAN; -- start level 2
SAVE TRANSACTION MySavePointDos;
SELECT @@TRANCOUNT AS [TranCount]; -- 2
INSERT INTO #SaveTranTestB (SomeVal) VALUES (200);
COMMIT; -- exit level 2
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestB;
-- 100
-- 200
ROLLBACK TRANSACTION MySavePointUno; --error occurred; undo actions up to this point
SELECT @@TRANCOUNT AS [TranCount]; -- 1
SELECT * FROM #SaveTranTestB;
-- <no rows>
COMMIT; -- exit level 1
SELECT @@TRANCOUNT AS [TranCount]; -- 0
SELECT * FROM #SaveTranTestB;
-- <no rows>