এসকিউএল সার্ভারে লেনদেনের সঠিক ব্যবহার


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
@ পাইওটারনরোট নং, যদি লেনদেনের সৃষ্টি ব্যর্থ হয় তবে এটি ধরায় রোলব্যাক করার দরকার নেই is
মনসাইনর

114

সঞ্চিত পদ্ধতির শুরুতে ত্রুটির ক্ষেত্রে স্বয়ংক্রিয়ভাবে রোলব্যাক রোলব্যাক করার জন্য এসকিএল সার্ভারকে নির্দেশ দেওয়ার জন্য SET XACT_ABORT চালু করা উচিত । যদি বাদ দেওয়া হয় বা বন্ধ সেট করা থাকে তবে প্রতিটি স্টেটমেন্টের পরে @@ ERROR পরীক্ষা করতে বা ট্রাই ... ক্যাচ রোলব্যাক ব্লক ব্যবহার করা দরকার।


2
অন্য কথায়, যদি আপনি প্রথমে XACT_ABORT সেট না করেন তবে আপনার লেনদেনটি পারমাণবিক নয়।
ভোর 4 টা

ইউআরএলটি নিম্নরেখাঙ্কিত করে দেখা শক্ত, তবে সেখানে একটি আন্ডারস্কোর রয়েছেXACT_ABORT
বার্নসবিএ

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.