অচলাবস্থার কারণে স্কেলএক্সসেপশন কীভাবে ধরা যায়?


94

.NET 3.5 / C # অ্যাপ্লিকেশন থেকে, আমি ধরতে চাই SqlExceptionতবে কেবল এটি এসকিউএল সার্ভার ২০০৮ উদাহরণস্বরূপ ডেডলকগুলির কারণে ঘটে

সাধারণত ত্রুটি বার্তা হয় Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

তবুও, এই ব্যতিক্রমটির জন্য এটি কোনও নথিভুক্ত ত্রুটি কোড বলে মনে হচ্ছে না ।

তাদের বার্তায় ডেডলক কীওয়ার্ডের উপস্থিতি বিরুদ্ধে ফিল্টার ব্যতিক্রম এই আচরণটি অর্জনের জন্য খুব কুৎসিত উপায় বলে মনে হচ্ছে। কেউ কি এটি করার সঠিক উপায় জানেন?


4
আমি (পরিশেষে) ত্রুটি কোডের জন্য ডকুমেন্টেশন পেয়েছি: এমএসডিএন.মাইক্রোসফট.ফেন / লাইব্রেরি /aa337376.aspx । আপনি নিজে এসকিউএল সার্ভারের মাধ্যমে এটিও খুঁজে পেতে পারেন:select * from master.dbo.sysmessages where error=1205
মার্টিন ম্যাকনল্ট্রি

উত্তর:


157

একটি অচলাবস্থার জন্য মাইক্রোসফ্ট এসকিউএল সার্ভার-নির্দিষ্ট ত্রুটি কোডটি 1205, সুতরাং আপনার স্কেলএক্সসেপশন পরিচালনা করতে হবে এবং এটির জন্য পরীক্ষা করা উচিত। সুতরাং, উদাহরণস্বরূপ, যদি অন্য সব ধরণের স্কেলএক্সসেপশনের জন্য আপনি বুদ্বুদ ব্যতিক্রম চান:

catch (SqlException ex)
{
    if (ex.Number == 1205)
    {
        // Deadlock 
    }
    else
        throw;
}

অথবা, সি # 6 এ ব্যতিক্রম ফিল্টারিং ব্যবহার করে

catch (SqlException ex) when (ex.Number == 1205)
{
    // Deadlock 
}

প্রদত্ত বার্তার জন্য আসল এসকিউএল ত্রুটি কোডটি সন্ধান করার জন্য একটি সহজ কাজ হ'ল এসকিউএল সার্ভারে sys.messages অনুসন্ধান করা।

যেমন

SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033

ডেডলকগুলি হ্যান্ডেল করার একটি বিকল্প উপায় (এসকিউএল সার্ভার ২০০৫ এবং তারপরের থেকে), এটি ট্রাই ... ক্যাচ সমর্থন ব্যবহার করে একটি সঞ্চিত পদ্ধতিতে করা:

BEGIN TRY
    -- some sql statements
END TRY
BEGIN CATCH
    IF (ERROR_NUMBER() = 1205)
        -- is a deadlock
    ELSE
        -- is not a deadlock
END CATCH

এমএসডিএন-তে এখানে সম্পূর্ণ উদাহরণ রয়েছে কীভাবে এসকিউএল-এর মধ্যে ডেডলক পুনরায় চেষ্টা যুক্তি প্রয়োগ করতে হবে।


4
নোট করুন যে ত্রুটি কোডগুলি বিক্রেতার জন্য নির্দিষ্ট, সুতরাং 1205 এসকিউএল সার্ভারের জন্য একটি অচলাবস্থা, তবে এটি ওরাকল, মাইএসকিউএল ইত্যাদির জন্য পৃথক হতে পারে
ব্রায়ানমার্নস

4
ডেটা স্তরের উপর নির্ভর করে, SqlExceptionঅন্যটি একটিতে আবৃত হতে পারে। সুতরাং আমাদের যে কোনও ব্যতিক্রম ধরণের ধরতে হবে এবং সেগুলি পরীক্ষা করার প্রয়োজন হতে পারে, যদি তারা সরাসরি কোনও অচল ব্যতিক্রম না হয় তবে পুনরাবৃত্তভাবে তাদের পরীক্ষা করুন InnerException
ফ্রাডেরিক

46

কারণ আমি মনে করি আপনি সম্ভবত ব্যর্থ অপারেশনটি আবার চেষ্টা করতে সক্ষম হয়ে ডেডলকগুলি সনাক্ত করতে চান, আমি আপনাকে একটু গোটার জন্য সতর্ক করতে চাই। আমি আশা করি আপনি এখানে কিছুটা দূরে থাকায় আমাকে ক্ষমা করবেন।

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

এটি সম্পর্কে সচেতন হওয়া গুরুত্বপূর্ণ। এসকিউএল দ্বারা সৃষ্ট ব্যর্থতার ক্ষেত্রে সম্পূর্ণ সংযোগটি ডুমেড বিবেচনা করা ভাল। অপারেশনটির পুনরায় চেষ্টা কেবলমাত্র সেই স্তরেই করা যায় যেখানে লেনদেনটি সংজ্ঞায়িত হয় (সেই লেনদেন এবং এর সংযোগটি পুনরায় তৈরি করে)।

সুতরাং আপনি যখন ব্যর্থ ক্রিয়াকলাপটি আবার চেষ্টা করছেন, দয়া করে নিশ্চিত হন যে আপনি একটি সম্পূর্ণ নতুন সংযোগ খোল করেছেন এবং একটি নতুন লেনদেন শুরু করেছেন।


4
আপনার সম্পূর্ণ নতুন সংযোগের দরকার কেন? আমি এই উত্তর সম্পর্কে এখানে একটি প্রশ্ন পোস্ট করেছি ।
স্যাম

3

ডেডলক সনাক্তকরণের জন্য এখানে একটি সি # 6 উপায়।

try
{
    //todo: Execute SQL. 
    //IMPORTANT, if you used Connection.BeginTransaction(), this try..catch must surround that code. You must rollback the original transaction, then recreate it and re-run all the code.
}
catch (SqlException ex) when (ex.Number == 1205)
{
    //todo: Retry SQL
}

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

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