সম্পাদনা: @ ম্যাক্স ভার্নন যেমন উল্লেখ করেছেন, নীলকে কোনওভাবেই নলোক ব্যবহার করার পরামর্শ নেই , এবং আমার খুব ভালভাবে লেনদেনের স্তরটি স্থির করার কথা বলা উচিত READ UNCOMMITED
এবং সেখানে নেতিবাচক ধারণাটি NOLOCK
প্রথম স্থানে না এসে দাঁড়াতে দেওয়া উচিত । সুতরাং যেমনটি পোস্ট হয়েছে:
দ্রুত এবং সহজ হ'ল "হ্যাঁ, প্রথম ক্যোয়ারী দ্বিতীয় ক্যোয়ারিকে ব্লক করবে যদি না নির্দিষ্ট সূচক ইঙ্গিতটি নির্দিষ্ট করা হয় ( NOLOCK , কখনও কখনও" নোংরা রিড "নামে পরিচিত) বা দ্বিতীয় ক্যোয়ারীর লেনদেনের বিচ্ছিন্নতা স্তর সেট করা হয় READ UNCOMMITED
(যা একইভাবে পরিচালিত হয়), না, তা হয় না "
WITH
দ্বিতীয়টিতে একটি ধারা অন্তর্ভুক্ত করার প্রশ্নে প্রদত্ত অতিরিক্ত বিশদের প্রতিক্রিয়া SELECT
হিসাবে, পারস্পরিকভাবে একচেটিয়া বা অন্যথায় হওয়া, দুটি প্রশ্নের মধ্যে পারস্পরিক মিথস্ক্রিয়া মূলত একই রকম হবে।
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'Foo'
AND type = 'U' )
BEGIN
--DROP TABLE dbo.Foo;
CREATE TABLE dbo.Foo
(
Foo_PK BIGINT IDENTITY( 1, 1 ) NOT NULL,
PRIMARY KEY ( Foo_PK ),
Bar BIT,
x BIT,
y BIT,
z BIT
);
CREATE NONCLUSTERED INDEX IX_Foo_x
ON dbo.Foo ( x );
INSERT INTO dbo.Foo ( Bar, x, y, z )
VALUES ( 1, 1, 1, 1 ), ( 0, 0, 0, 0 );
END;
GO
BEGIN TRANSACTION;
UPDATE dbo.Foo
SET y = 0
WHERE x = 1;
-- COMMIT TRANSACTION;
একটি পৃথক অধিবেশনে, নিম্নলিখিতটি চালান:
SELECT *
FROM dbo.Foo WITH ( NOLOCK );
GO
SELECT *
FROM dbo.Foo;
আপনি চালিয়ে বর্তমানে লকগুলি পরীক্ষা করে দেখতে পারেন sp_lock
, অন্য কোনও পৃথক অধিবেশনটিতে সাধারণত:
EXECUTE dbo.sp_lock;
আপনি (একচেটিয়া) মোডে KEY
সন্নিবেশ লেনদেন সম্পাদন করে স্পিডের দ্বারা আটকে থাকা কোনও প্রকারের লকটি দেখতে পাবেন X
, অন্য IX
(ইনটেন্ট-এক্সক্লুসিভ) লক্সের সাথে বিভ্রান্ত হওয়ার দরকার নেই । লক ডকুমেন্টেশন ইঙ্গিত করে যে যখন KEY
লক পরিসর-নির্দিষ্ট হয়, এটি অন্যান্য লেনদেন ঢোকাতে বা তথ্য পরিবর্তনের দ্বারা প্রভাবিত কলাম আপডেট করতে বাধা দেয় তাতে যাতে এটি মূল প্রশ্নের সাথে যে পরিসীমা মধ্যে কমে আসতে পারে রয়েছে। যে লকটি নিজেই রাখা হচ্ছে তা একচেটিয়া হওয়ায় প্রথম ক্যোয়ারীটি অন্য কোনও সমবর্তী লেনদেন থেকে সংস্থানটিতে অ্যাক্সেস আটকাচ্ছে। বাস্তবে, কলামের সমস্ত সারি লক করা আছে, সেগুলি প্রথম ক্যোয়ারির দ্বারা নির্ধারিত সীমার মধ্যে পড়ে কিনা।
S
লক দ্বিতীয় সেশনে দ্বারা অনুষ্ঠিত হচ্ছে এইভাবে হবে WAIT
যতক্ষণ না X
লক মুছে ফেলা হবে, আরেকটি বাধা X
(অথবা U
) একটি ভিন্ন সমবর্তী spid থেকে যে সম্পদ গ্রহণ হওয়ার আগে দ্বিতীয় সেশনে তার পঠিত অপারেশন সম্পূর্ণ হলে, অস্তিত্ব justifying থেকে লক S
লক।
স্পষ্টতার জন্য এখন একটি সম্পাদনা: যদি না আমি এখানে উল্লিখিত ঝুঁকির সংক্ষিপ্ত বিবরণ থেকে একটি নোংরা পাঠকে ভুল না করি ... সম্পাদনা 3 : আমি ঠিক বুঝতে পেরেছি যে আমি একটি ব্যাকগ্রাউন্ড চেকপয়েন্টের প্রভাব বিবেচনা করছি না যা একটি লিখেছে এখনও ডিস্কে অনির্ধারিত লেনদেনের, তাই হ্যাঁ, আমার ব্যাখ্যাটি বিভ্রান্তিকর ছিল।
দ্বিতীয় ক্যোয়ারিতে, প্রথম ব্যাচটি (এবং এই ক্ষেত্রে, অসম্পূর্ণ) ডেটা ফিরিয়ে দিতে পারে। ডিফল্ট লেনদেনের বিচ্ছিন্নতার স্তরে চলমান দ্বিতীয় ব্যাচটি READ COMMITED
প্রথম সেশনে কমিট বা রোলব্যাক শেষ হওয়ার পরেই ফিরে আসবে।
এখান থেকে আপনি আপনার ক্যোয়ারী পরিকল্পনা এবং সম্পর্কিত লক স্তরগুলি দেখতে পারেন তবে আরও ভাল, আপনি এসকিউএল সার্ভারে লকগুলি সম্পর্কে সমস্ত এখানে পড়তে পারেন ।
SELECT * FROM Table1
আমার প্রয়োজনের ঠিক যদি এটি হয় তবে এটি কীভাবে খারাপ অভ্যাস ?