আমি বেশ কয়েক বছর ধরে টি-এসকিউএল বিকাশ করছি এবং ভাষার সব দিক সম্পর্কে আমি যতটা পারি শিখতে চালিয়ে যাচ্ছি এবং সর্বদা আরও খনন করছি। আমি সম্প্রতি একটি নতুন সংস্থায় কাজ করা শুরু করেছি এবং লেনদেন সম্পর্কিত আমার কাছে একটি বিজোড় পরামর্শ বলে আমি মনে করি তা পেয়েছি। এগুলি কখনও ব্যবহার করবেন না। পরিবর্তে, এমন একটি workaround ব্যবহার করুন যা কোনও লেনদেনের অনুকরণ করে। এটি আমাদের ডিবিএর কাছ থেকে আসছে যারা প্রচুর লেনদেনের সাথে একটি ডাটাবেসে কাজ করে এবং পরবর্তীকালে প্রচুর অবরুদ্ধ করে। আমি যে ডেটাবেসটিতে প্রাথমিকভাবে কাজ করি তা এই সমস্যাটিতে ভুগছে না এবং আমি দেখি যে লেনদেন অতীতে ব্যবহৃত হয়েছিল।
আমি বুঝতে পারি যে লেনদেনের সাথে ব্লক করা আশা করা হয় যেমন এটি করা তাদের প্রকৃতি এবং আপনি যদি কোনওভাবেই ব্যবহার না করে চলে যেতে পারেন তবে তা সর্বদা করুন। তবে আমার অনেকগুলি অনুষ্ঠান রয়েছে যেখানে প্রতিটি বিবৃতি সফলভাবে কার্যকর করা উচিত। যদি কোনও ব্যর্থ হয় তবে তাদের অবশ্যই সকলের প্রতিশ্রুতিবদ্ধ হতে ব্যর্থ হবে।
আমি সর্বদা আমার লেনদেনের ক্ষেত্রটি যথাসম্ভব সঙ্কীর্ণ রেখেছি, সর্বদা সেট এক্সএসিএএবিএবিআরটির সাথে এবং সর্বদা ট্রাই / ক্যাচের মধ্যে ব্যবহার করি।
উদাহরণ:
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
সম্প্রদায়ের কাছে আমার প্রশ্নটি নীচে রয়েছে। এটি কি লেনদেনের জন্য একটি কার্যক্ষম কর্ম হিসাবে বিবেচনা করে?
লেনদেন সম্পর্কে আমি যা জানি এবং সমাধানটি কী প্রস্তাব দিচ্ছে তার থেকে আমার মতামতটি হ'ল না, এটি একটি কার্যকর সমাধান নয় এবং ব্যর্থতার অনেকগুলি পয়েন্ট পরিচয় করিয়ে দেয়।
প্রস্তাবিত কাজের ক্ষেত্রে আমি দেখতে পাচ্ছি চারটি নিহিত লেনদেন। চেষ্টাতে দুটি সন্নিবেশ করান এবং তারপরে ক্যাশে মুছে ফেলার জন্য আরও দুটি লেনদেন। এটি সন্নিবেশগুলিকে "পূর্বাবস্থায় ফেরাতে" দেয় তবে কোনও কিছুই পিছনে না ঘটিয়ে তাই কিছুই আসলে ফিরে যায় না।
তারা যে ধারণাটি প্রস্তাব করছে তা প্রদর্শনের জন্য এটি একটি খুব প্রাথমিক উদাহরণ। কিছু সত্যিকারের সঞ্চিত প্রক্রিয়া যা আমি এগুলি করে যাচ্ছি তা সম্পূর্ণরূপে দীর্ঘ এবং পরিচালনা করা কঠিন কারণ "উদাহরণস্বরূপ" ঘূর্ণায়মান "একাধিক ফলাফল সেট বনাম দুটি প্যারামিটার মানগুলি বনাম যেমন আপনি কল্পনা করতে পারেন তা বেশ জটিল হয়ে ওঠে। যেহেতু এখন "রোলিং ব্যাক" ম্যানুয়ালি করা হচ্ছে, তাই আসল কারণ কিছু মিস করার সুযোগ।
আমি মনে করি যে আর একটি সমস্যা টাইমআউট বা বিচ্ছিন্ন সংযোগের জন্য exists এটি এখনও ফিরে ঘূর্ণিত পেতে হবে? এটি কেন SEX XACT_ABORT অন ব্যবহার করা উচিত তা আমার বোঝার যাতে এই ক্ষেত্রে, লেনদেনটি পিছনে ফিরে আসবে।
আপনার মতামতের জন্য আগাম ধন্যবাদ!