ইউপডলক, হোল্ডলক সম্পর্কে বিভ্রান্ত


92

টেবিল ইঙ্গিতগুলির ব্যবহার নিয়ে গবেষণা করার সময় , আমি এই দুটি প্রশ্ন পেয়েছি:

উভয় প্রশ্নের উত্তরগুলি বলে যে ব্যবহার করার সময় (UPDLOCK, HOLDLOCK), অন্যান্য প্রক্রিয়াগুলি সেই টেবিলের ডেটা পড়তে সক্ষম হবে না, তবে আমি এটি দেখিনি। পরীক্ষা করতে, আমি একটি টেবিল তৈরি করেছি এবং দুটি এসএসএমএস উইন্ডো শুরু করেছি। প্রথম উইন্ডো থেকে, আমি একটি লেনদেন চালিয়েছি যা বিভিন্ন টেবিলের ইঙ্গিত ব্যবহার করে টেবিল থেকে নির্বাচন করেছে। লেনদেন চলমান থাকাকালীন, দ্বিতীয় উইন্ডো থেকে আমি বিভিন্ন স্টেটমেন্ট চালিয়েছিলাম যা দেখতে অবরুদ্ধ হবে।

পরীক্ষার টেবিল:

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

এসএসএমএস উইন্ডো 1 থেকে:

BEGIN TRANSACTION

SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'

COMMIT TRANSACTION

এসএসএমএস উইন্ডো 2 থেকে (নিম্নলিখিতগুলির মধ্যে একটি রান করেছেন):

SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'

উইন্ডো 2 তে চলমান বিবৃতিগুলিতে বিভিন্ন টেবিলের ইঙ্গিতগুলির প্রভাব:

           (UPDLOCK)       (HOLDLOCK)    (UPDLOCK, HOLDLOCK)    (TABLOCKX)
---------------------------------------------------------------------------
SELECT    not blocked      not blocked       not blocked         blocked
INSERT    not blocked        blocked           blocked           blocked
UPDATE      blocked          blocked           blocked           blocked
DELETE      blocked          blocked           blocked           blocked

আমি কি এই প্রশ্নগুলিতে দেওয়া উত্তরগুলি ভুল বুঝেছি, বা আমার পরীক্ষায় ভুল করেছি? যদি তা না হয় তবে আপনি কেন (UPDLOCK, HOLDLOCK)বনাম বনাম ব্যবহার (HOLDLOCK)করবেন?


আমি কী অর্জন করতে চাই তার আরও ব্যাখ্যা:

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

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

বর্তমানে, আমি বিশ্বাস করি (HOLDLOCK)এটিই আমার ব্যবহার করা উচিত তবে আমি উদ্বিগ্ন যে আমি কোনও ভুল করেছি বা এমন কিছু উপেক্ষা করেছি যা ভবিষ্যতে আমাকে কামড়ানোর জন্য ফিরে আসবে, এই কারণেই এই প্রশ্নটি।

উত্তর:


104

আপলোডক ব্লক কেন নির্বাচন করবে? লক সামঞ্জস্যের ম্যাট্রিক্স পরিষ্কারভাবে দেখায় Nএস / u এবং ইউ / এস বিবাদের, হিসাবে জন্য কোন দ্বন্দ্ব

হোল্ডলোকের ইঙ্গিত হিসাবে ডকুমেন্টেশনটি বলে:

হলডক: সিরিয়ালজ্যালের সমতুল্য। আরও তথ্যের জন্য, এই বিষয়ে পরে গুরুতর দেখুন।

...

গুরুতর: ... স্ক্যানটি সিরিয়ালজিক বিচ্ছিন্নতা স্তরে চলমান লেনদেনের মতো একই শব্দার্থক দিয়ে সম্পাদিত হয় ...

এবং লেনদেনের বিচ্ছিন্নতা স্তর বিষয়টি SIIALIZABLE এর অর্থ কী:

বর্তমান লেনদেনটি সম্পূর্ণ না হওয়া অবধি বর্তমান কোনও লেনদেন দ্বারা পড়া পড়া ডেটা অন্য কোনও লেনদেন সংশোধন করতে পারে না।

অন্যান্য লেনদেনগুলি মূল মান সহ নতুন সারি সন্নিবেশ করতে পারে না যা বর্তমান লেনদেনের কোনও বিবৃতি দ্বারা বর্তমান লেনদেন শেষ না হওয়া অবধি পড়ার কীগুলির সীমাতে পড়ে।

অতএব আপনি যে আচরণটি দেখছেন সেটিকে পণ্যের ডকুমেন্টেশন দ্বারা পুরোপুরি ব্যাখ্যা করা হয়েছে:

  • আপডলক সাম্প্রতিক নির্বাচন বা INSERT অবরুদ্ধ করে না, তবে টি 1 দ্বারা নির্বাচিত সারিগুলির কোনও আপডেট বা ডিলিট ব্লক করে
  • হোল্ডলক এর অর্থ SERALIZABLE এবং অতএব নির্বাচনগুলি অনুমতি দেয় তবে T1 দ্বারা নির্বাচিত সারিগুলির আপডেট এবং ডিলিটগুলি অবরুদ্ধ করে, পাশাপাশি টি 1 দ্বারা নির্বাচিত পরিসরের কোনও INSERT (যা পুরো টেবিল, সুতরাং কোনও সন্নিবেশ করানো হয়)।
  • (আপডলক, হোল্ডলক): আপনার পরীক্ষাটি উপরের কেস ছাড়াও কী অবরুদ্ধ করবে তা দেখায় না, যাহা টি 2-তে ইউপডলকের সাথে অন্য একটি লেনদেন :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • ট্যাব্লোকএক্স-এর ব্যাখ্যার দরকার নেই

আসল প্রশ্ন আপনি অর্জন করার চেষ্টা করছেন কি ? লক ইঙ্গিত সহ ডাব্লু / ও লকিং শব্দার্থবিজ্ঞানের নিখুঁত সম্পূর্ণ 110% বোঝার সাথে বাজানো সমস্যার জন্য ভিক্ষা করছে ...

ওপি সম্পাদনার পরে:

আমি কোনও টেবিল থেকে সারিগুলি নির্বাচন করতে চাই এবং প্রসেস করার সময় সেই টেবিলের ডেটা পরিবর্তন করতে বাধা দিতে চাই।

আপনার উচ্চতর লেনদেনের বিচ্ছিন্নতার স্তরগুলির একটি ব্যবহার করা উচিত। পুনঃপঠনযোগ্য পড়ুন আপনার পড়া ডেটা সংশোধন করা থেকে বিরত করবে। সিরিয়ালটি আপনার পড়া ডেটা সংশোধন করা এবং নতুন ডেটা sertedোকানো থেকে আটকাবে । লেনদেনের বিচ্ছিন্নতা স্তরগুলি ব্যবহার করা কোয়েরি ইঙ্গিতগুলি ব্যবহারের বিপরীতে সঠিক পদ্ধতির। কেন্দ্র লিটলের বিচ্ছিন্নতার স্তরগুলি ব্যাখ্যা করার জন্য একটি দুর্দান্ত পোস্টার রয়েছে


+1, এবং বিস্তারিত প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ। আমার লক্ষ্যটি কী তা বিশদ যুক্ত করতে আমি আমার প্রশ্ন আপডেট করব।
জেফ ওগটা

4
@ রেমাস রুসানু আপনি কি দয়া করে বিশদটি বর্ণনা করতে পারেন কেন কোয়েরি ইঙ্গিতগুলি ব্যবহারের বিপরীতে সঠিক পদ্ধতির বিচ্ছিন্নতা স্তরগুলি ব্যবহার করা হচ্ছে? আমার একটি পদ্ধতি রয়েছে যেখানে আমার কেবল দুটি টেবিলগুলি পরিবর্তন করা থেকে লক করা দরকার এবং আমি ট্যাবলক, হোল্ডলক ব্যবহার করছি, আমার কি সত্যই বিচ্ছিন্নতা স্তরে পরিবর্তন হওয়া উচিত এবং আমার লেনদেনে সমস্ত টেবিল লক করা উচিত?
স্টিভ

আমি ট্যাব্লোকএক্সএক্স :) এর জন্য ব্যাখ্যাটি পছন্দ করতে পারি :)
নিকো

দ্রষ্টব্য: কেন্দ্র লিটলের ব্লগ প্রবেশের লিঙ্কটি একটি 404 প্রদান করে the
বেকন বিটস

22

আপনি যখন ভবিষ্যতের আপডেটের স্টেটমেন্টের জন্য একটি নির্বাচিত বিবৃতি চলাকালীন কোনও সারি বা সারিগুলিকে লক করতে চান তখন আপডলক ব্যবহার করা হয়। ভবিষ্যতের আপডেটটি লেনদেনের খুব পরবর্তী বিবৃতি হতে পারে।

অন্যান্য সেশনগুলি এখনও ডেটা দেখতে পারে। তারা কেবলমাত্র লডগুলি পেতে পারে না যেগুলি আপলোডক এবং / অথবা হোল্ডলকের সাথে সঙ্গতিপূর্ণ নয়।

আপনি লক করেছেন এমন সারিগুলি পরিবর্তন করা থেকে অন্য সেশনগুলি আটকাতে চাইলে আপনি আপডলক ব্যবহার করেন। এটি লকড সারিগুলি আপডেট বা মুছতে তাদের ক্ষমতা সীমাবদ্ধ করে।

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


4
আপনাকে ধন্যবাদ, তবে আমি মনে করি না আপনি সত্যিই আমার প্রশ্নের জবাব দিয়েছেন: এই প্রশ্নগুলির উত্তর কি এই (UPDLOCK,HOLDLOCK)ব্লকটি পড়ে ভুল বলেছিল , এবং ন্যায়বিচারের (UPDLOCK,HOLDLOCK)পরিবর্তে ব্যবহার করার কোনও কারণ আছে (HOLDLOCK)?
জেফ ওগটা

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

আপডেটলক, হোল্ডলক হোল্ডলকের মতো নয়। আপডেটলক, হোল্ডলক আপডেটের জন্য সারিগুলিকে লক করে এবং আপনার লেনদেনকে সিরিয়ালাইজ করে। নিজেই হোল্ডলক আপনার লেনদেনকে সিরিয়ালাইজ করে। এটি আরও অ্যাক্সেসের জন্য নির্বাচিত সারিগুলিকে লক করে না।
স্কট ব্রুনস

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