ALLOW_SNAPSHOT_ISOLATION এবং READ_COMMITTED_SNAPSHOT


38

অনলাইনে ফোরাম এবং উদাহরণ অনলাইনে সর্বদা উভয়ই রাখার পরামর্শ দেয় ALLOW_SNAPSHOT_ISOLATIONএবং READ_COMMITTED_SNAPSHOTযখনই কেউ স্ন্যাপশট, সারি সংস্করণ বা অনুরূপ প্রশ্ন জিজ্ঞাসা করে তা চালু রাখুন।

আমি অনুমান করি উভয় সেটিংয়ে এসএনএপশট শব্দটি কিছুটা বিভ্রান্ত হয়ে পড়ে। আমি সারি ব্যবহার READ_COMMITTED ডিফল্ট আচরণের জন্য কেশ পরিবর্তে ভার্সন ডাটাবেস ইঞ্জিন যে চিন্তা, যাতে, ডাটাবেজ READ_COMMITTED_SNAPSHOTচালু হিসাবে সেট করা নির্বিশেষে কি ALLOW_SNAPSHOT_ISOLATIONসেটিং।

ALLOW_SNAPSHOT_ISOLATIONসেটিং যখন একটি লেনদেন (যেমন সেট লেনদেন বিচ্ছিন্নতা লেভেল স্ন্যাপশট) শুরু শুধুমাত্র স্ন্যাপশট বিচ্ছিন্নতা অনুমতি চালু হিসাবে সেট করা নির্বিশেষে এর READ_COMMITTED_SNAPSHOTসেটিং।

এই দুটি সেটিংস চালু রাখার একমাত্র কারণ হ'ল যখন এটির পাঠ্য সংযুক্তি সারি সংস্করণ এবং স্ন্যাপশট বিচ্ছিন্নতা থাকা দরকার।

আমার প্রশ্নটি হল, আমার বোঝাপড়াটি কি কোনওভাবে ভুল? এবং এই যে দুটি সেটিং সবসময় একসাথে চালু করতে হবে (বিশেষত রিড কমিটেড সারি ভার্সনের জন্য)?

উত্তর:


25

আপনার বোঝাপড়াটি সঠিক। এটি একটি বিভ্রান্তিকর পেতে।

কিম ট্রিপ (এসকিউএল সার্ভারের অন্যতম প্রোগ্রামার এবং এসকিউএলকিস্কিলের একটি অবিচ্ছেদ্য অংশ) স্ন্যাপশট বিচ্ছিন্নকরণের এমসিএম ভিডিওগুলিতে আপনি যা বলেছিলেন ঠিক সেভাবেই চলে যায় । তিনি আপনার প্রশ্নের যে অংশে উত্তর দিয়েছেন সে অংশটি পেতে ভিডিওতে f১:৪৫ তে দ্রুত প্রবেশ করুন।

আপনি যদি নিজের কোডটিতে ব্যবহার করেন ALLOW_SNAPSHOT_ISOLATIONতা নিশ্চিত করে নিন SET TRANSACTION ISOLATION LEVEL SNAPSHOT, অন্যথায় আপনি কোনও সুবিধা পাবেন না।

আপনি যদি সেট করে থাকেন SET READ_COMMITTED_SNAPSHOT ONতবে কোনও কোড সংশোধন করার দরকার নেই। এমএস এসকিউএল সার্ভার স্বয়ংক্রিয়ভাবে সেই টেবিলটির জন্য স্ন্যাপশট বিচ্ছিন্নতা প্রয়োগ করে।

আপনি যদি আপনার কোডটিতে আলাদা বিচ্ছিন্নতা স্তরটির জন্য জিজ্ঞাসা করেন তবে কী হয় তা দেখার জন্য আমি পরীক্ষা করে দেখিনি, আমার সন্দেহ হয় যে এটি এই বিকল্পটি ওভাররাইট করে তবে প্রথমে এটি পরীক্ষা করবে।

স্ন্যাপশট বিচ্ছিন্নতা ব্যবহার করে পারফরম্যান্সের ওভারহেডের এক ঝলক নজর।

কীভাবে স্ন্যাপশট বিচ্ছিন্নতা আপনার অ্যাপের প্রত্যাশিত আচরণ পরিবর্তন করতে পারে সে সম্পর্কে ভাল নিবন্ধ । এটি কীভাবে একটি আপডেট স্টেটমেন্ট এবং একটি নির্বাচিত বিবৃতি সম্পূর্ণ ভিন্ন এবং অপ্রত্যাশিত ফলাফল প্রত্যাবর্তন করতে পারে তার উদাহরণগুলি দেখায়।


লিঙ্কের জন্য ধন্যবাদ। অন্যান্য বিওএল-র মতো তিনিও এই দুটি সেটিংস স্বাধীনভাবে এবং সম্মিলিতভাবে আলোচনা করেছিলেন (সেখান থেকে এটি কিছুটা বিভ্রান্তি পায়, অথবা সম্ভবত আমি এটি ভাবেন)। আরও ভাল বোঝার জন্য আমাকে এটি পরীক্ষা করে দেখতে হয়েছিল।
ট্র্যাভিস

4
এটি দুর্দান্ত উত্তর এবং আমি কেবল কয়েকটি আইটেম পরিষ্কার করতে চাই। প্রথমত, আপনি যদি কেবল ভিডিওটি স্ক্যান করছেন, 23:18 থেকে শুরু করুন 41:45 হিসাবে। প্রাথমিক সময় আরও বিশদ যুক্ত করে। যদিও কিম মূল প্রশ্নের উত্তরের উল্লেখ করেছেন, এখনও উভয়টি ব্যবহার করে কোড সংশোধন করা দরকার। পঠন_কমিত_সন্যাপশটটি বিবৃতি-স্তরের বিচ্ছিন্নতা, অন্য কথায় কেবল বর্তমানে চলমান বিবৃতিতে প্রযোজ্য। মঞ্জুরি দিন_সন্যাপশট_বিচ্ছিন্নতা হ'ল লেনদেন-স্তরের বিচ্ছিন্নতা, বিগান ট্রান এবং কমিটের মধ্যে থাকা সমস্ত কিছুই। তারা পৃথকভাবে নিযুক্ত থাকতে পারে, তবে প্রতি সারি একই 14-বাইট ওভারহেড প্রতিষ্ঠিত।
ডিলাক্স

14 বাইট ওভারহেড প্রতিষ্ঠিত হওয়ার জন্য অতিরিক্ত বিশদ যুক্ত করার জন্য আপনাকে ধন্যবাদ। কিম ভিডিওটিতে এটি ব্যবহার করে তবে এটি এখানে টেক্সটে থাকা খুব দরকারী।
আলী রাজেঘি

15

ঠিক আছে, ঘরে ফিরে পরীক্ষা করলাম। এই নিরীক্ষণ।

CREATE DATABASE TEST;
GO
CREATE TABLE TABLE1
(
    ID tinyint,
    Details varchar(10)
);
GO
INSERT INTO TABLE1
VALUES (1, 'Original');
GO

SELECT
    name,
    snapshot_isolation_state_desc,
    is_read_committed_snapshot_on
FROM sys.databases
WHERE name = 'TEST';
GO

উভয় সেটিংসের সাথে প্রথম পরীক্ষা বন্ধ থাকার বিষয়টি নিশ্চিত হয়েছে।

প্রশ্ন ঘ

USE TEST;

BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;

--COMMIT;
--ROLLBACK;
GO

প্রশ্ন 2

USE TEST;

SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO

এই পরীক্ষায়, ক্যোয়ারী 2 কোয়েরি 1 টি করার জন্য অপেক্ষা করছে, dm_tran_locks DMV দেখায় যে 1 টি ক্যোয়ারী দ্বারা গৃহীত TABLE1 এ একচেটিয়া লক রয়েছে।

USE TEST;

SELECT
    DB_NAME(tl.resource_database_id) AS DBName,
    resource_type,
    OBJECT_NAME(resource_associated_entity_id) AS tbl_name,
    request_mode,
    request_status,
    request_session_id
FROM sys.dm_tran_locks tl
WHERE 
    resource_database_id = db_id('TEST')
    AND resource_type = 'OBJECT'

দ্বিতীয় পরীক্ষা , রোলব্যাক পূর্ববর্তী লেনদেন, READ_COMMITTED_SNAPSHOT চালু করুন তবে ALLOW_SNAPSHOT_ISOLATION অফ ছেড়ে দিন।

ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO

ক্যোয়ারী 1 চালান, এবং ক্যোয়ারি চালান ২। ডিএমভি কোয়েরিটি 1 টিতে একচেটিয়া লক দেখায়, কিন্তু কোয়েরি 2 কোয়েরি 1 ছাড়াই 'অরিজিনাল' দিয়ে বিশদ বিবরণ প্রত্যাবর্তন করে। এটি প্রদর্শিত হয় যে READ_COMMITTED সারি সংস্করণটি স্থানে রয়েছে।

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;ক্যোয়ারী 1 এবং ক্যোয়ারি 2 তে যোগ করা এবং 1 টি ক্যোয়ারী চালানো বা কোয়েরি 2 টি ত্রুটি প্রদান করে - স্ন্যাপশট বিচ্ছিন্ন লেনদেন 'TEST' ডাটাবেস অ্যাক্সেস করতে ব্যর্থ হয়েছে কারণ এই ডাটাবেসে স্ন্যাপশট বিচ্ছিন্নতার অনুমতি নেই। স্ন্যাপশট বিচ্ছিন্নকরণের অনুমতি দেওয়ার জন্য ALTER DATABASE ব্যবহার করুন।

তৃতীয় পরীক্ষা , রোলব্যাক পূর্ববর্তী লেনদেন। READ_COMMITTED_SNAPSHOT OFF এবং ALLOW_SNAPSHOT_ISOLATION চালু করুন।

ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT OFF
WITH ROLLBACK IMMEDIATE;
GO

ALTER DATABASE TEST
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

ক্যোয়ারী 1 চালান এবং তারপরে কোয়েরি ২. ডিএমভি ক্যোয়ারী ১ দ্বারা ব্যতীত একচেটিয়া লক দেখায় Qu কোয়েরি ২ মনে হয় কোয়েরি 1 সম্পূর্ণ হওয়ার জন্য অপেক্ষা করছে। ALLOW_SNAPSHOT_ISOLATION চালু করা READ COMMITTED সারি সংস্করণ সক্ষম করে বলে মনে হচ্ছে না।

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;ক্যোয়ারী 1 এবং ক্যোয়ারী উভয়টিতে যোগ করা 2. ক্যোয়ারি 1 চালান এবং তারপরে কোয়েরি 2। ডিএমভি কোয়েরি 1 দেখায় একচেটিয়া লক, কোয়েরি 2 'রিজিনাল' দিয়ে ফেরতের বিশদ বিবরণ দেয়। স্ন্যাপশট বিচ্ছিন্নতা জায়গায় উপস্থিত রয়েছে।

পরীক্ষার পর্যবেক্ষণ থেকে দেখা যায় যে READ_COMMITTED_SNAPSHOTসেড নির্বিশেষে READ COMMITTED সারি সংস্করণ ALLOW_SNAPSHOT_ISOLATIONএবং তার বিপরীতে নিজেই সক্ষম / অক্ষম করে ।


4

আপনার বোঝাপড়াটি সঠিক। আমি এখান থেকে সংক্ষিপ্ত, পরিষ্কার এবং সহজ সংজ্ঞা পছন্দ করি :

যখন READ_COMMITTED_SNAPSHOT ডাটাবেস বিকল্প চালু থাকে, তখন লেনদেনগুলি পড়ার জন্য প্রতিশ্রুতিবদ্ধ বিচ্ছিন্নতা স্তরের সারি সংস্করণ ব্যবহার করে transactions

যখন ALLOW_SNAPSHOT_ISOLATION ডাটাবেস বিকল্প চালু থাকে, তখন লেনদেনগুলি স্ন্যাপশট বিচ্ছিন্নকরণ স্তর সেট করতে পারে।

মনে হচ্ছে এমএস থেকেই অনেক ভুল বোঝাবুঝি আসে। উদাহরণস্বরূপ, তারা এখানে বলে:

আপনি যদি READ_COMMITTED_SNAPSHOT ডাটাবেস বিকল্পটি চালু করে থাকেন, ডাটাবেস ইঞ্জিন ডেটা সুরক্ষার জন্য লক ব্যবহার না করে ডিফল্ট হিসাবে সারি সংস্করণ এবং স্ন্যাপশট বিচ্ছিন্নতা ব্যবহার করে।

তবে উল্লিখিত "স্ন্যাপশট বিচ্ছিন্নতা" লেনদেনের আচরণের সমান নয় যার set transaction isolation level snapshotজন্য প্রয়োগ করা হয়।

পার্থক্য হিসাবে, চমৎকার ব্যাখ্যা এখানে

সম্ভবত এটি আরও ভাল হবে যদি READ_COMMITTED_SNAPSHOT এর নাম READ_COMMITTED_ROW_VERSIONING বা এর মতো কিছু দেওয়া হয়েছিল। :)


0

আমি মাইক্রোসফ্ট থেকে এই সারাংশ পছন্দ :

READ_COMMITTED_SNAPSHOT অন বিকল্পটি সেট করা ডিফল্ট READ COMMITTED বিচ্ছিন্নতা স্তরের অধীনে সংস্করণযুক্ত সারিগুলিতে অ্যাক্সেসের অনুমতি দেয়। যদি READ_COMMITTED_SNAPSHOT বিকল্পটি অফ করা থাকে, তবে সংস্করণযুক্ত সারিগুলিতে অ্যাক্সেস পাওয়ার জন্য আপনাকে অবশ্যই প্রতিটি সেশনের জন্য স্ন্যাপশট বিচ্ছিন্নতা স্তরটি স্পষ্টভাবে নির্ধারণ করতে হবে।

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