मैं कई वर्षों से टी-एसक्यूएल का विकास कर रहा हूं और हमेशा आगे खुदाई कर रहा हूं, भाषा के सभी पहलुओं के बारे में जानने के लिए सभी को सीखना जारी रखूंगा। मैंने हाल ही में एक नई कंपनी में काम करना शुरू किया है और मुझे लगता है कि लेन-देन के बारे में एक अजीब सुझाव है। कभी उनका उपयोग न करें। इसके बजाय, एक लेनदेन का अनुकरण करने वाले वर्कअराउंड का उपयोग करें। यह हमारे डीबीए से आ रहा है जो एक डेटाबेस में बहुत सारे लेनदेन के साथ काम करता है और बाद में, बहुत से अवरोधक। मैं जिस डेटाबेस में मुख्य रूप से काम करता हूं वह इस समस्या से ग्रस्त नहीं है और मुझे लगता है कि लेनदेन का उपयोग अतीत में किया गया है।
मैं समझता हूं कि ऐसा करना लेनदेन के साथ अवरुद्ध करना अपेक्षित है क्योंकि ऐसा करना उनकी प्रकृति में है और यदि आप किसी एक का उपयोग किए बिना इसे दूर कर सकते हैं, तो हर तरह से ऐसा करें। लेकिन मेरे पास कई अवसर हैं जहां प्रत्येक कथन को सफलतापूर्वक निष्पादित करना होगा। यदि कोई विफल हो जाता है तो वे सब करने में विफल होना चाहिए।
मैंने हमेशा अपने लेन-देन के दायरे को यथासंभव कम रखा है, हमेशा SET XACT_ABORT ON और हमेशा TRY / CATCH के संयोजन में उपयोग किया जाता है।
उदाहरण:
CREATE SCHEMA someschema;
GO
CREATE TABLE someschema.tableA
(id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
ColA VARCHAR(10) NOT NULL
);
GO
CREATE TABLE someschema.tableB
(id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
ColB VARCHAR(10) NOT NULL
);
GO
CREATE PROCEDURE someschema.ProcedureName @ColA VARCHAR(10),
@ColB VARCHAR(10)
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO someschema.tableA(ColA)
VALUES(@ColA);
INSERT INTO someschema.tableB(ColB)
VALUES(@ColB);
--Implement error
SELECT 1/0
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@trancount > 0
BEGIN
ROLLBACK TRANSACTION;
END;
THROW;
RETURN;
END CATCH;
END;
GO
यहाँ उन्होंने सुझाव दिया है कि मैं करता हूँ।
GO
CREATE PROCEDURE someschema.ProcedureNameNoTransaction @ColA VARCHAR(10),
@ColB VARCHAR(10)
AS
SET NOCOUNT ON;
BEGIN
BEGIN TRY
DECLARE @tableAid INT;
DECLARE @tableBid INT;
INSERT INTO someschema.tableA(ColA)
VALUES(@ColA);
SET @tableAid = SCOPE_IDENTITY();
INSERT INTO someschema.tableB(ColB)
VALUES(@ColB);
SET @tableBid = SCOPE_IDENTITY();
--Implement error
SELECT 1/0
END TRY
BEGIN CATCH
DELETE FROM someschema.tableA
WHERE id = @tableAid;
DELETE FROM someschema.tableB
WHERE id = @tableBid;
THROW;
RETURN;
END CATCH;
END;
GO
समुदाय के लिए मेरा प्रश्न इस प्रकार है। क्या यह लेन-देन के लिए एक व्यवहार्य समाधान के रूप में समझ में आता है?
लेन-देन के बारे में मुझे जो पता है और समाधान का प्रस्ताव है उससे मेरी राय यह है कि नहीं, यह एक व्यवहार्य समाधान नहीं है और विफलता के कई बिंदुओं का परिचय देता है।
सुझाए गए वर्कअराउंड में, मुझे चार निहित लेनदेन दिखाई दे रहे हैं। कोशिश में दो आवेषण और फिर पकड़ने में विलोप के लिए दो और लेनदेन। यह आवेषण को "पूर्ववत" करता है, लेकिन कुछ भी वापस किए बिना कुछ भी नहीं वास्तव में वापस लुढ़का हुआ है।
यह उनके द्वारा सुझाई गई अवधारणा को प्रदर्शित करने के लिए एक बहुत ही बुनियादी उदाहरण है। कुछ वास्तविक संग्रहित प्रक्रियाएँ जो मैं कर रहा हूँ, उन्हें पूरी तरह से लंबे समय तक करना और प्रबंधित करना मुश्किल है क्योंकि "रोलिंग बैक" कई परिणाम बनाम दो पैरामीटर मान इस उदाहरण में काफी जटिल हो जाते हैं जैसा कि आप कल्पना कर सकते हैं। चूंकि "रोलिंग बैक" अब मैन्युअल रूप से किया जा रहा है, इसलिए वास्तविक के कारण कुछ मिस करने का अवसर।
एक और मुद्दा जो मुझे लगता है कि मौजूद है, टाइमआउट या अलग किए गए कनेक्शन के लिए है। क्या यह अभी भी लुढ़का हुआ है? यह मेरी समझ है कि क्यों सेट XACT_ABORT ON का उपयोग किया जाना चाहिए ताकि इन मामलों में, लेन-देन वापस हो जाए।
अग्रिम में आपकी प्रतिक्रिया के लिए धन्यवाद!