SQL सर्वर में लेनदेन का सही उपयोग


236

मेरे पास 2 कमांड हैं और उन दोनों को सही ढंग से निष्पादित करने की आवश्यकता है या उनमें से कोई भी निष्पादित नहीं किया गया है। इसलिए मुझे लगता है कि मुझे एक लेन-देन की आवश्यकता है, लेकिन मुझे नहीं पता कि इसका सही उपयोग कैसे किया जाए।

निम्नलिखित स्क्रिप्ट में क्या समस्या है?

BEGIN TRANSACTION [Tran1]

INSERT INTO [Test].[dbo].[T1]
    ([Title], [AVG])
VALUES ('Tidd130', 130), ('Tidd230', 230)

UPDATE [Test].[dbo].[T1]
  SET [Title] = N'az2' ,[AVG] = 1
  WHERE [dbo].[T1].[Title] = N'az'

COMMIT TRANSACTION [Tran1]
GO

INSERTआदेश निष्पादित किया जाता है, लेकिन UPDATEआदेश एक समस्या है।

अगर दोनों में से किसी को भी निष्पादन में कोई त्रुटि होती है तो मैं इसे कैसे लागू कर सकता हूं?

जवाबों:


513

यदि कोई लेन-देन सफल होता है, तो यह एक प्रयास / कैच ब्लॉक जोड़ें, यदि लेनदेन विफल हो जाता है, तो लेनदेन विफल हो जाता है:

BEGIN TRANSACTION [Tran1]

  BEGIN TRY

      INSERT INTO [Test].[dbo].[T1] ([Title], [AVG])
      VALUES ('Tidd130', 130), ('Tidd230', 230)

      UPDATE [Test].[dbo].[T1]
      SET [Title] = N'az2' ,[AVG] = 1
      WHERE [dbo].[T1].[Title] = N'az'

      COMMIT TRANSACTION [Tran1]

  END TRY

  BEGIN CATCH

      ROLLBACK TRANSACTION [Tran1]

  END CATCH  

1
BEGIN TRANSACTION [Tran1]अंदर नहीं रखा जाना चाहिए TRY? वैसे भी - कोड का बहुत सरल और सुरुचिपूर्ण टुकड़ा।
पिओटर नवरोट

4
@PiotrNawrot नहीं, यदि लेन-देन निर्माण विफल रहा, तो इसे पकड़ने में रोलबैक करने की कोई आवश्यकता नहीं है।
मोंसिगनोर

114

संग्रहीत कार्यविधि की शुरुआत में SET XACT_ABORT को Sql सर्वर को निर्देश देना चाहिए कि त्रुटि के मामले में स्वचालित रूप से रोलबैक लेनदेन करने के लिए। यदि ommated या प्रत्येक कथन के बाद @@ ERROR का परीक्षण करने के लिए किसी को सेट करने की आवश्यकता है या TRY ... CATCH रोलबैक ब्लॉक का उपयोग करें ।


2
दूसरे शब्दों में, जब तक आप पहले XACT_ABORT सेट नहीं करते, तब तक आपका लेनदेन परमाणु नहीं होता है।
4AM

यह यूआरएल रेखांकित के साथ देखने के लिए मुश्किल है, लेकिन वहाँ में एक अंडरस्कोर हैXACT_ABORT
BurnsBA

32

आसान तरीका:

CREATE TABLE T
(
    C [nvarchar](100) NOT NULL UNIQUE,
);

SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error.
SELECT * FROM T; -- Check before.
BEGIN TRAN
    INSERT INTO T VALUES ('A');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('B');
    INSERT INTO T VALUES ('C');
COMMIT TRAN
SELECT * FROM T; -- Check after.
DELETE T;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.