এসকিউএল সার্ভারে, পঠিত লকগুলি কীভাবে কাজ করবে?


17

ধরুন আমার কাছে নিম্নলিখিত দীর্ঘ-চলমান ক্যোয়ারী রয়েছে

UPDATE [Table1]
SET [Col1] = 'some value'
WHERE [Col2] -- some clause which selects thousands of rows

এবং ধরুন উপরের ক্যোয়ারি চলাকালীন নিম্নলিখিত কোয়েরিটি কার্যকর করা হয়েছে

SELECT *
FROM [Table1]

প্রথম ক্যোয়ারীটি প্রথম ক্যোয়ারী শেষ না হওয়া পর্যন্ত দ্বিতীয় ক্যোয়ারীটি চালানো থেকে বাধা দেয়? যদি তা হয়, তবে প্রথম ক্যোয়ারীটি দ্বিতীয় কোয়েরিটি সমস্ত সারিগুলিতে চলতে বা WHERE ধারাটিতে জড়িত কেবল সারিগুলিকে আটকাতে পারে?

সম্পাদনা করুন:

ধরা যাক দ্বিতীয় কোয়েরিটি হল

SELECT [Col1], [Col2]
FROM [Table1]
WHERE [Col2] -- some clause whose matching elements overlap those from
             -- the clause in the first query and which has additional matching elements

উত্তর:


14

আমি আপনাকে সুপারিশ করি যে এসকিউএল সার্ভার কীভাবে কোনও কোয়েরি কার্যকর করে তা বোঝার জন্য , এটি কীভাবে পড়া এবং লেখার কাজ এবং কীভাবে লকিং কাজ করে তার ব্যাখ্যা রয়েছে has

10000 ফুট ভিউটি নীচে চলেছে:

  • রিডার অপারেটররা ডেটা পড়ার আগে তারা যে ডেটা পড়ে তা নিয়ে ভাগ করা লকগুলি অর্জন করে
  • লিখিত অপারেটররা ডেটা সংশোধন করার আগে তাদের যে ডেটা সংশোধন করে তা একচেটিয়া লক সংগ্রহ করে
  • ডেটা লকগুলি কেবল স্ট্রিং, যেমন। কী এর একটি হ্যাশ ডাটাবেস এবং অবজেক্ট দ্বারা স্কোপড পড়া।
  • লক সামঞ্জস্যতা ম্যাট্রিক্স অনুসারে লক ম্যানেজার মঞ্জুর করা সমস্ত লকের একটি তালিকা বজায় রাখে এবং অসঙ্গতিগুলি সনাক্ত করে dete
  • অসামঞ্জস্য অনুদানগুলি অবরুদ্ধ হওয়া অবধি বেআইনী অনুরোধগুলি স্থগিত করা হয়
  • অপারেটররা উচ্চ স্তরে (পৃষ্ঠা বা টেবিল স্তর, পার্টিশন স্তরের বিকল্পগুলি উপেক্ষা করে) ডেটা পড়তে বা আপডেট করার অভিপ্রায়টি ঘোষণার জন্য একটি লক শ্রেণিবিন্যাস ব্যবহার করে। এটি অপারেটরগুলিকে প্রতিটি পৃথক সারি লক করে পুরো টেবিলগুলি লক করতে দেয়
  • উচ্চতর বিচ্ছিন্নতা স্তরগুলি প্রয়োগ করতে লক লাইফটাইম এবং রেঞ্জ লকগুলি ব্যবহৃত হয়

এটি সত্যই বরফ বার্গের টিপ। বিষয়টি বিশাল। আপনার উদাহরণস্বরূপ, আসলে লক করা হচ্ছে এমন বিষয়ে আপনার প্রশ্নের উত্তর কেউ দিতে পারে না কারণ এটি অনেকগুলি বিষয়ের উপর নির্ভর করবে। অবশ্যই, কোনও অ্যাপ্লিকেশন SELECT * FROM Table1 এটিকে ইস্যু করা উচিত নয় কারণ এটি একটি পুরো ধারাটি অনুপস্থিত এবং ব্যবহার করছে *। এগুলি খারাপ অভ্যাসগুলি কারণ অন্যান্য বিষয়গুলির মধ্যেও তারা সঠিকভাবে বিতর্ককে লক করবে।

যদি আপনি পড়ুন বনাম। লকগুলির মুখোমুখি হন তবে আপনাকে সারি সংস্করণ এবং স্ন্যাপশট বিচ্ছিন্নতা সন্ধান করতে হবে। সারি সংস্করণ-ভিত্তিক বিচ্ছিন্নতা স্তরগুলি বোঝার পড়ুন ।


আমার যদি কোনও টেবিলের সমস্ত বিষয়বস্তু প্রয়োজন (বলুন যে এতে আমার কেবল 14 টি সারি রয়েছে)? SELECT * FROM Table1আমার প্রয়োজনের ঠিক যদি এটি হয় তবে এটি কীভাবে খারাপ অভ্যাস ?
আজিমুথ

1
*এটি নিজেরাই একটি খারাপ অভ্যাস, কারণ যখন টেবিলের কাঠামো পরিবর্তন হয় তখন অ্যাপ্লিকেশনটি প্রায়শই ভেঙে যায় (ফলস্বরূপ অপ্রত্যাশিত কলামগুলি উপস্থিত হয়)।
রিমাস রুসানু

3

সম্পাদনা: @ ম্যাক্স ভার্নন যেমন উল্লেখ করেছেন, নীলকে কোনওভাবেই নলোক ব্যবহার করার পরামর্শ নেই , এবং আমার খুব ভালভাবে লেনদেনের স্তরটি স্থির করার কথা বলা উচিত 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প্রথম সেশনে কমিট বা রোলব্যাক শেষ হওয়ার পরেই ফিরে আসবে।

এখান থেকে আপনি আপনার ক্যোয়ারী পরিকল্পনা এবং সম্পর্কিত লক স্তরগুলি দেখতে পারেন তবে আরও ভাল, আপনি এসকিউএল সার্ভারে লকগুলি সম্পর্কে সমস্ত এখানে পড়তে পারেন ।


1
ব্যবহার সম্পর্কে সতর্কতার একটি শব্দ WITH (NOLOCK)এই ক্ষেত্রে সহায়ক হবে। দেখুন brentozar.com/archive/2011/11/... এবং brentozar.com/archive/2013/02/... আরো পড়ার জন্য।
ম্যাক্স ভার্নন

3
ওহ, WITH (NOLOCK)ইঙ্গিতটি মেমরি থেকে নোংরা পৃষ্ঠাগুলি দেয় না যা প্রতিশ্রুতিবদ্ধ হয় নি। এটি টেবিলের সারিগুলি (অন-ডিস্ক বা মেমরির ক্যাশেড কিনা) টেবিলের দ্বারা ব্যবহৃত পৃষ্ঠাগুলিতে সারিগুলি আপডেট করা বা যোগ করা থেকে বিরত রাখে reads
ম্যাক্স ভার্নন

2
আমি বিভ্রান্ত যদি "1 ম ক্যোয়ারী 2 য়টি চালানো থেকে বাধা দেয়?" "না", কীভাবে দ্বিতীয় প্রশ্নের উত্তর "হ্যাঁ" হতে পারে? আপনি কোন প্রশ্নের উত্তর দিচ্ছেন তা স্পষ্ট করতে এবং আপনার উত্তরগুলিতে প্রসারিত করতে পারেন?
সমস্ত ট্রেডের জোন

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