কোন SAVE TRANSACTION। এটি ব্যবহারের জন্য আমি কখনও কোনও মামলা পাইনি। আমি জানি কিছু লোকেরা এটি পছন্দ করে তবে আমি যে কোনও স্থানে কাজ করেছি এমন কিছুতেই আমি নেস্টেড স্তরের যে কোনও একটিতে ঘটে যাওয়া ত্রুটির ধারণাটি ইঙ্গিত করে যে ইতিমধ্যে যা কাজ হয়েছে তা অবৈধ। SAVE TRANSACTIONআপনি ব্যবহার করে আপনি কেবলমাত্র এই স্টোরড পদ্ধতিটি ডাকার আগেই রাজ্যে ফিরে যাচ্ছেন, বিদ্যমান প্রক্রিয়াটিকে অন্যথায় বৈধ হিসাবে রেখে।
আপনি যদি আরও বিশদ চান SAVE TRANSACTIONতবে দয়া করে এই উত্তরের তথ্যটি একবার দেখুন:
3 সঞ্চিত প্রক্রিয়া যখন একটি সঞ্চিত পদ্ধতি থেকে শুরু হয় তখন কীভাবে রোলব্যাক করবেন
এর সাথে আরেকটি সমস্যা SAVE TRANSACTIONহ'ল তার আচরণের সংক্ষিপ্তসার, যেমন সংরক্ষণের ট্রান্সঅ্যাকশন (জোর যুক্ত করা হয়েছে) এর এমএসডিএন পৃষ্ঠায় উল্লেখ করা হয়েছে :
ডুপ্লিকেট সেভপয়েন্টের নামগুলি কোনও লেনদেনে অনুমোদিত হয়, তবে একটি রোলব্যাক ট্রান্সঅ্যাকশন বিবৃতি যা সেফপয়েন্টের নামটি নির্দিষ্ট করে কেবল সেই নামটি ব্যবহার করে লেনদেনটিকে সর্বাধিক সাম্প্রতিক সংরক্ষণের ট্রানসেকশনে ফিরে যাবে ।
অর্থ, প্রতিটি সঞ্চিত পদ্ধতিতে প্রতিটি সেভ পয়েন্ট দেওয়ার জন্য আপনাকে খুব সতর্ক হওয়া দরকার যা সমস্ত সঞ্চিত পদ্ধতিতে সমস্ত সেভ পয়েন্টগুলিতে অনন্য। নিম্নলিখিত উদাহরণগুলি এই বিষয়টিকে চিত্রিত করে।
এই প্রথম উদাহরণটি দেখায় যে আপনি যখন সেভ পয়েন্ট নামটি পুনরায় ব্যবহার করবেন তখন কী হয়; কেবলমাত্র সর্বনিম্ন-স্তরের সেভ পয়েন্টটি রোলড-ব্যাক হয়।
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>