এস -কিউএল সার্ভারে এস-এম ওয়েট এসইচ-এস-কে ব্লক করে 2014 তবে এসকিউএল সার্ভার নয় 2008 আর 2?


11

আমরা সম্প্রতি এসকিউএল 2008 আর 2 থেকে ব্র্যান্ডের নতুন এসকিউএল 2014 সার্ভারগুলিতে আমাদের উত্পাদন উদাহরণগুলি স্থানান্তরিত করেছি। এখানে একটি আকর্ষণীয় দৃশ্য যা আমাদের পরিষেবা ব্রোকারের ব্যবহারের সাথে আমরা উন্মোচিত করেছি। সঙ্গে একটি ডাটাবেস বিবেচনা Broker Enabled = trueসঙ্গে MyServiceএবং MyQueue। বিষাক্ত বার্তা হ্যান্ডলিং এই সারিটিতে অক্ষম। সারিতে বার্তাগুলির সাথে কমপক্ষে 2 টি সক্রিয় কথোপকথন রয়েছে।

একটি প্রক্রিয়ায় (এসপিআইডি 100) সম্পাদন করুন:

BEGIN TRANSACTION;
DECLARE @conversation_group_id UNIQUEIDENTIFIER;
RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue;

নোট করুন যে আমরা লেনদেনটি উন্মুক্ত রেখেছি। কল্পনা করুন যে এটি একটি। নেট প্রোগ্রাম যা কিছু বাহ্যিক সংস্থার জন্য দীর্ঘ সময় অপেক্ষা করে। এর মাধ্যমে sys.dm_tran_locksআমরা দেখতে যে এই SPID কিউ উপর একটি নবম লক মঞ্জুর করা হয়েছে।

| type   | resource_id | mode | status | spid |
| OBJECT | 277576027   | IX   | GRANT  | 100  |

একটি পৃথক প্রক্রিয়াতে (এসপিআইডি 101) পাঁচবার কার্যকর করুন :

BEGIN TRANSACTION;
DECLARE @conversation_group_id UNIQUEIDENTIFIER;
RECEIVE TOP (1) @conversation_group_id = conversation_handle FROM MyQueue;
ROLLBACK TRANSACTION;

এখানে মূল কীটি হ'ল আমরা পাঁচবার লেনদেনটি ফিরিয়ে আনছি । এটি বিল্ট ইন পয়জন মেসেজ হ্যান্ডলিংয়ের পটভূমি যুক্তিকে ট্রিগার করে । সারিটি অক্ষম না হওয়া অবস্থায় (কারণ এটি অক্ষম না করার জন্য কনফিগার করা হয়েছে), একটি পটভূমি টাস্ক এখনও কাজ করার চেষ্টা করে এবং একটি broker_queue_disabledইভেন্ট ফায়ার করে । সুতরাং এখন আমরা যদি sys.dm_tran_locksআবার জিজ্ঞাসা করি তবে আমরা একটি ভিন্ন এসপিআইডি দেখতে পাব (যার সাথে সম্পর্কিত BRKR TASK) কোনও এস-এম লকটিতে অপেক্ষা করা।

| type   | resource_id | mode  | status | spid |
| OBJECT | 277576027   | IX    | GRANT  | 100  |
| OBJECT | 277576027   | Sch-M | WAIT   | 36   |

এখনও অবধি, সমস্ত কিছু বোধগম্য হয়।

অবশেষে, একটি আলাদা প্রক্রিয়াতে (এসপিআইডি 102), সেই সারিটি ব্যবহার করে কোনও পরিষেবাতে প্রেরণের চেষ্টা করুন:

BEGIN TRANSACTION;
DECLARE @ch uniqueidentifier;
BEGIN DIALOG @ch FROM SERVICE [MyService] TO SERVICE 'MyService';
SEND ON CONVERSATION @ch ('HELLO WORLD');

SENDকমান্ড অবরোধ করা হয়েছে। আমরা যদি আবার তাকান তবে sys.dm_tran_locksআমরা দেখতে পাই যে এই প্রক্রিয়াটি কোনও এস-এস লকটিতে অপেক্ষা করছে। কার্যকর করে sp_who2আমরা দেখতে পেলাম যে এসপিআইডি 102 এসপিআইডি 36 দ্বারা অবরুদ্ধ।

| type   | resource_id | mode  | status | spid |
| OBJECT | 277576027   | IX    | GRANT  | 100  |
| OBJECT | 277576027   | Sch-M | WAIT   | 36   |
| OBJECT | 277576027   | Sch-S | WAIT   | 102  |

কেন একটি এস-এস লক অপেক্ষা করছে এমন কোনও এস-এম লকটিতে অপেক্ষা করছে?

এসকিউএল ২০০৮ আর 2 এ এই আচরণটি সম্পূর্ণ আলাদা! এই একই একই পরিস্থিতিটি ব্যবহার করে, আমাদের এখনও অবধি-বাতিল-হওয়া ২০০৮ -২-এর দৃষ্টান্তগুলিতে চলমান, SENDকমান্ড সহ চূড়ান্ত ব্যাচটি অপেক্ষারত এস-এম লক দ্বারা আটকাবে না

এসকিউএল 2012 বা 2014 এ লকিংয়ের আচরণটি পরিবর্তিত হয়েছে? সম্ভবত এমন কোনও ডাটাবেস বা সার্ভার সেটিং রয়েছে যা এই লকিং আচরণকে প্রভাবিত করতে পারে?


সম্ভাব্য বাগের মতো শোনাচ্ছে। আপনি কি সর্বশেষতম এসপি এবং সিইউ প্রয়োগ করেছেন?
ম্যাক্স ভার্নন

1
@ ম্যাক্স ভার্নন আমরা 12.00.2370 চালিয়ে যাচ্ছি
জোসেফ

3
আপনি উদ্যোগ এবং লক্ষ্য হিসাবে একই পরিষেবা ব্যবহার করছেন। SENDব্লক সময় চেক ইনিশিয়েটরের কিউ। লক্ষ্য কাতারে SENDঅবরুদ্ধ করবে না , এটি কেবল বাউন্স করে সরবরাহ করার জন্য ব্যবহার করবে । আপনি যদি দুজনকে আলাদা করেন (সর্বদা একটি ভাল ধারণা) আপনার সমস্যা হবে না। sys.transmission_queue
রেমাস রুসানু

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

উত্তর:


17

আচরণটি এসকিউএল সার্ভার ২০০৮ আর 2 এবং এসকিউএল সার্ভার ২০১২-এর মধ্যে পরিবর্তিত হয়েছিল। ২০০৮ আর -2 বাস্তবায়ন নথিভুক্ত 'রিলাক্স ফিফো' শব্দার্থবিরোধের সাথে সঙ্গতিপূর্ণ নয় :

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

নতুন লক অনুরোধগুলি যেখানে অনুরোধকারীর এখনও রিসোর্সে কোনও লকের মালিকানা নেই তবে যদি অনুরোধ মোড অনুমোদিত মঞ্জুরিপ্রাপ্ত অনুরোধগুলির মীমাংসা এবং মুলতুবি থাকা অনুরোধগুলির মোডের সাথে সামঞ্জস্য না হয় blocked

রূপান্তর অনুরোধটি কেবল তখনই রূপান্তরিত হয় যখন অনুরোধ মোডটি সমস্ত মঞ্জুর মোডের ইউনিয়নের সাথে সামঞ্জস্য না করে, রূপান্তর অনুরোধটি নিজেই মূলত মঞ্জুর করা মোডকে বাদ দিয়ে।

২০০৮ আর ২-তে, একটি নতুন Sch-Sলক অনুরোধ অনুমোদিত এবং অপেক্ষার অনুরোধগুলির ইউনিয়নের সাথে সামঞ্জস্য না থাকা সত্ত্বেও মঞ্জুরি দেওয়া হয়েছিল, যা লক অনাহারে ডেকে আনতে পারে। ২০১২ সালে, Sch-Sলক অনুরোধটি অবরুদ্ধ করা হয়েছে।

নীচে প্রজনন স্ক্রিপ্টটি কোনও পরিষেবা ব্রোকারের সারিটির পরিবর্তে নিয়মিত সারণী ব্যবহার করে:

-- Session 1
CREATE TABLE dbo.LockTest (col1 integer NULL);

INSERT dbo.LockTest (col1) VALUES (1);

BEGIN TRANSACTION;

-- Will hold row-X, Pag-IX, and Tab-IX
INSERT dbo.LockTest (col1) VALUES (2);

-- Session 2
-- Blocked waiting on Sch-M
TRUNCATE TABLE dbo.LockTest;

-- Session 3
-- Takes Sch-S only
-- Not blocked in 2008 R2
SELECT * FROM dbo.LockTest AS LT WITH (READUNCOMMITTED);

সংক্ষেপে, ২০০৮ আর 2 ডিজাইনের মতো আচরণ করে নি। সমস্যাটি এসকিউএল সার্ভার ২০১২-এ স্থির করা হয়েছিল।

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