সঞ্চিত পদ্ধতির জন্য কোনও লেনদেন ব্যবহার করবেন না


18

আমার একটি সঞ্চিত পদ্ধতি রয়েছে যা কয়েকটি কমান্ড চালায়। আমি চাই না যে এই আদেশগুলি সঞ্চিত পদ্ধতির লেনদেনের মধ্যে মোড়ানো হোক। যদি চতুর্থ কমান্ড ব্যর্থ হয়, আমি চাই যে ১ ম, দ্বিতীয় এবং তৃতীয়টি রোলব্যাক না করেই থাকুক।

সঞ্চিত পদ্ধতিটি এমনভাবে লেখা সম্ভব যে এটি সমস্ত একটি বড় লেনদেন হিসাবে কার্যকর হয় না?

উত্তর:


16

সমস্ত লেনদেন একক লেনদেনে কার্যকর হবে না। এই উদাহরণটি একবার দেখুন:

use TestDB;
go

if exists (select 1 from sys.tables where object_id = object_id('dbo.TestTranTable1'))
    drop table dbo.TestTranTable1;
create table dbo.TestTranTable1
(
    id int identity(1, 1) not null,
    some_int int not null
        default 1
);
go

insert into dbo.TestTranTable1
default values;
go 4

select *
from dbo.TestTranTable1;

if exists (select 1 from sys.sql_modules where object_id = object_id('dbo.ChangeValues'))
begin
    drop proc dbo.ChangeValues;
end
go
create proc dbo.ChangeValues
as
    update dbo.TestTranTable1
    set some_int = 11
    where id = 1;

    update dbo.TestTranTable1
    set some_int = 12
    where id = 2;

    update dbo.TestTranTable1
    set some_int = 13
    where id = 3;

    -- this will error out (arithmetic overflow)
    update dbo.TestTranTable1
    set some_int = 2147483648
    where id = 4;
go

exec dbo.ChangeValues;

select *
from dbo.TestTranTable1;

এখানে ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

sql_transactionইভেন্টটি নিরীক্ষণের জন্য বর্ধিত ইভেন্টস সেশন তৈরি করে , এখানে সম্পাদন করা থেকে প্রাপ্ত ফলাফল dbo.ChangeValues:

এখানে চিত্র বর্ণনা লিখুন

আপনি উপরের এই স্ক্রিনশটটিতে দেখতে পাচ্ছেন, চারটি স্টেটমেন্টের প্রত্যেকটির জন্য আলাদা লেনদেন রয়েছে। প্রথম 3 টি প্রতিশ্রুতিবদ্ধ এবং শেষটি ত্রুটির কারণে পিছনে ফিরে আসে।


16

আমি মনে করি একটি ব্যাচ বনাম লেনদেন সম্পর্কে কিছু বিভ্রান্তি থাকতে পারে ।

একটি লেনদেনের একটি বিবৃতি বা বক্তব্য যে হয় সফল বা ইউনিট হিসাবে ব্যর্থ হবে এর সেট। সমস্ত ডিডিএল স্টেটমেন্টগুলি নিজেরাই লেনদেনে রয়েছে (যেমন আপনি যদি 100 টি সারি আপডেট করেন তবে সারি 98 একটি ত্রুটি নিক্ষেপ করে, সারিগুলির কোনওটিই আপডেট হয় না)। আপনি কোনও লেনদেনের পাশাপাশি বিভিন্ন স্টেটমেন্টের বিবৃতি গুটিয়ে রাখতে পারেন BEGIN TRANSACTIONএবং তারপরে হয় হয় COMMITবা হয়ও ROLLBACK

একটি ব্যাচ হ'ল বিবরণীর একটি সিরিজ যা একসাথে কার্যকর করা হয়। সঞ্চিত পদ্ধতিটি ব্যাচের উদাহরণ is সঞ্চিত পদ্ধতিতে, যদি একটি বিবৃতি ব্যর্থ হয় এবং ত্রুটি ট্র্যাপিংয়ের (সাধারণত TRY/CATCHব্লক) থাকে তবে পরবর্তী বিবৃতিগুলি কার্যকর হবে না will

আমার সন্দেহ হয় আপনার সমস্যাটি হ'ল ব্যাচটি বাতিল হয়ে যাচ্ছে যখন কোনও ত্রুটি দেখা দেয় কারণ সঞ্চিত প্রকট নিজেই বা কোনও বহিরাগত স্কোপ (যেমন অ্যাপ্লিকেশন বা সঞ্চিত প্রোক যেমন এই পদ্ধতিটিকে কল করে) এর মধ্যে আটকাতে ত্রুটি রয়েছে। যদি এটি হয় তবে এটি সমাধানের জন্য এটি আরও জটিল since যেহেতু আপনার যে কোনও সুযোগে আটকে থাকা ত্রুটিগুলি কীভাবে পরিচালনা করতে হবে তা আপনাকে সামঞ্জস্য করতে হবে।


"কোনও স্টোর পদ্ধতি একটি ব্যাচের উদাহরণ" বলে কোনও নিবন্ধ আমি পাইনি। আমি বিশ্বাস করি স্টোরড পদ্ধতিটি ব্যাচের সাথে খুব মিল তবে এটি কোনও ব্যাচ নয়। মূল পার্থক্যটি হ'ল: এসপি বাচসের থেকে আলাদা একাধিকবার এগিয়ে সংকলন এবং মৃত্যুর জন্য প্রস্তুত হওয়ার গ্যারান্টিযুক্ত। মিলগুলি হ'ল: - তারা উভয়ই প্রতিটি কমান্ড একবারে কার্যকর করে exec - যদি একটি কমান্ড ব্যর্থ হয় তবে পূর্ববর্তী সমস্ত কমান্ডগুলি প্রতিশ্রুতিবদ্ধ হয় (যদি না এটি কোনও লেনদেন চলছিল) - যদি একটি কমান্ড ব্যর্থ হয় তবে পরবর্তী সমস্ত কমান্ড কার্যকর করা হয় না।
আশি

6

এসকিএল সার্ভারের সমস্ত কিছু একটি লেনদেনের মধ্যে রয়েছে।

আপনি যখন স্পষ্টভাবে নির্দিষ্ট করেন begin transactionএবং end transactionতারপরে এটিকে স্পষ্ট লেনদেন বলা হয় । আপনি যখন না ডান, তবে এটি অন্তর্ভুক্ত লেনদেন

আপনি কোন মোডে আছেন তা স্যুইচ করতে, আপনি ব্যবহার করবেন

set implicit_transactions on

অথবা

set implicit_transactions off

select @@OPTIONS & 2

যদি উপরে 2 প্রদান করে, আপনি অন্তর্ভুক্ত লেনদেনের মোডে আছেন। যদি এটি 0 ফেরত দেয় তবে আপনি স্বতঃসংশ্লিষ্ট in

একটি লেনদেন হ'ল সমস্ত বা কিছুই না একটি ডাটাবেস একটি সুসংগত অবস্থায় রাখতে .. এসিডি বৈশিষ্ট্য মনে রাখবেন।

CREATE TABLE [dbo].[Products](
    [ProductID] [int] NOT NULL,
    [ProductName] [varchar](25) NULL,
    [DatabaseName] [sysname] NOT NULL,
 CONSTRAINT [pk_Product_ID_ServerName] PRIMARY KEY CLUSTERED 
(
    [ProductID] ASC,
    [DatabaseName] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


-- insert some data 
INSERT INTO [dbo].[Products]([ProductID], [ProductName], [DatabaseName])
SELECT 1, N'repl1_product1', N'repl1' UNION ALL
SELECT 1, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 1, N'repl3_product1_03', N'repl3' UNION ALL
SELECT 2, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 2, N'repl2_product1', N'repl2' UNION ALL
SELECT 2, N'repl3_product1_03', N'repl3' UNION ALL
SELECT 3, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 3, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 3, N'repl3_product1', N'repl3' UNION ALL
SELECT 4, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 4, N'repl2_product1_02', N'repl2' UNION ALL
SELECT 5, N'repl1_product1_01', N'repl1' UNION ALL
SELECT 5, N'repl2_product1_02', N'repl2'

- এখনই এসপি তৈরি করুন - নোট করুন যে প্রথম 3 টি সফল হবে এবং চতুর্থটি স্ট্রিং কাটার কারণে ব্যর্থ হবে ...

IF OBJECT_ID ('usp_UpdateProducts', 'P') IS NOT NULL
    DROP PROCEDURE usp_UpdateProducts;
GO
create procedure usp_UpdateProducts
as 
begin try
update Products 
set ProductName = 'repl1_product1'
where DatabaseName = 'repl1'and ProductID = 1;
update Products
set ProductName = 'repl2_product1'
where DatabaseName = 'repl2' and ProductID = 2;
update Products
set ProductName = 'repl3_product1'
where DatabaseName = 'repl3' and ProductID = 3;
update Products
set ProductName = 'repl3_product1_03&&&&&&&&&&39399338492w9924389234923482' -- this will fail ...
where DatabaseName = 'repl3' and ProductID = 4;
SELECT 1/0;
end try
begin catch
SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;
end catch
go

দেখুন: সর্বদা লেনদেন তৈরি করা কি খারাপ অভ্যাস?


3

এইভাবে সঞ্চিত পদ্ধতিগুলি ডিফল্টরূপে কাজ করে। সঞ্চিত পদ্ধতি স্বয়ংক্রিয়ভাবে কোনও লেনদেনের মধ্যে আবৃত হয় না।

আপনি যদি সঞ্চিত প্রক্রিয়াটি প্রথম ত্রুটিটি আঘাত করে তখন বন্ধ করতে চান আপনি উদাহরণস্বরূপ কমান্ড 2 এর সমস্যা হলে ফিরে আসতে সেখানে কিছু TRY / CATCH লগইন রাখতে চান to


2

প্রতিটি কমান্ডের জন্য আপনার স্বতন্ত্র লেনদেনের প্রয়োজন হবে। আপনি সংরক্ষণিত লেনদেনের মাধ্যমে এটিও সম্পন্ন করতে পারেন:

দেখুন SAVE TRANSACTION (Transact-SQL)পণ্য ডকুমেন্টেশন হবে।

আমি সেই স্বতন্ত্র লেনদেনকে এটিকে সঞ্চিত পদ্ধতিগুলির জন্য ডিফল্ট আচরণের যোগ্য করতে চাই, কারণ সমস্ত বিবৃতি অন্তর্নিহিত লেনদেনে মুড়ে যায়; তবে তাদের কোডের গন্তব্য নিয়ন্ত্রণ করতে কারওই অন্তর্নিহিত লেনদেনের উপর নির্ভর করা উচিত নয়। উত্পাদন কোডে লেনদেনের পদ্ধতি যেভাবে পরিচালিত হয় তা স্পষ্টভাবে নিয়ন্ত্রণ করা এটি আরও অনেক ভাল অনুশীলন।


-2

প্রতিটি অংশ শুরু করে একটি বিগইন ট্রান দিয়ে এবং একটি লেনদেন সফল হয়েছিল কিনা তা যাচাই করে নিন। যদি এটি প্রতিশ্রুতিবদ্ধ হয়, অন্যথায় একটি রোলব্যাক করুন, যেহেতু তারা সবাই একই স্তর থেকে সম্পাদন করছে আপনি যদি ব্যর্থ হন তবে সমস্ত রোলব্যাক না করেই আপনি প্রতিটি বিভাগ আলাদাভাবে প্রতিশ্রুতিবদ্ধ করতে সক্ষম হবেন।

আরও তথ্যের জন্য আপনি এখানে একবার দেখে নিতে পারেন: http://msdn.microsoft.com/en-us/library/ms188929.aspx


1
এটি কি আমার সঞ্চিত পদ্ধতিতে সাব লেনদেন তৈরি করে? আদর্শভাবে আমি যদি সম্ভব হয় তা এড়াতে চাই
ম্যাথু স্টেপলস

1
যদি কোনও লেনদেনের মধ্যে থেকে এসপিকে ফোন করা হয়, তবে উপরে সংরক্ষিত লেনদেনের উত্তর। যদি এসপিটির সাথে ডাকা না হয়, তবে @ মির্ডেনি সঠিক। SQL সার্ভার নেস্টেড লেনদেন সমর্থন করে না।
স্ট্রেইজিডিবিএ

@ স্ট্রিটগিডিবিএ কেবল পরিষ্কার করার জন্য .. এসকিউএল সার্ভারে নেস্টেড লেনদেন রয়েছে, তবে সেগুলি মন্দ S পড়ুন sqlskills.com/blogs/paul/... , msdn.microsoft.com/en-us/library/ms189336(v=sql.105).aspx এবং sqlblog.com/blogs/kalen_delaney/archive/2007/08/13 /…
কিন শাহ

2
পরিষ্কার হওয়ার জন্য (এবং অলস যারা লিঙ্কগুলি ক্লিক করতে চান না তাদের জন্য), আপনি আসলে অন্য কোনও লেনদেন শুরু করছেন না। পলের পোস্টে আকা শিরোনাম: "পৌরাণিক কাহিনী: নেস্টেড লেনদেনগুলি আসল" " এগুলি সত্যিকারের লেনদেন নয়। নেস্টেড লেনদেনে কমিট কমানো ছাড়াই আর কিছু করে না @ ট্র্যানস্যাক্ট। এটি সত্য যে আপনি ট্রান / কমিট শুরু করলেও ত্রুটি পাবেন না, তবে এটি প্রকৃত নেস্টেড ট্রানজেকশনগুলি থেকে আলাদা।
স্ট্রেইজিডিডিবিএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.