নেটওয়ার্ক সংযোগ বিচ্ছিন্ন করা কি একটি কোয়েরি থামায়?


13

আমি সম্প্রতি 100,000 রেকর্ডের বিপরীতে একটি আপডেট ক্যোয়ারী কার্যকর করেছি। আমি বুঝতে পেরেছিলাম যে ক্যোয়ারি চলাকালীন আমি একটি ভুল করেছি এবং দ্রুত নেটওয়ার্কের কেবলটি প্লাগ লাগিয়েছি।

আপডেট কোয়েরি করে

  1. প্রক্রিয়াজাতকরণ এবং সম্পূর্ণ রোলব্যাক বন্ধ?
  2. সমাপ্তির প্রক্রিয়া চালিয়ে যান এবং প্রতিশ্রুতিবদ্ধ?
  3. প্রক্রিয়াকরণ বন্ধ করুন এবং লক্ষ্য সারিগুলির কেবলমাত্র এক অংশ আপডেট রেখে দেবেন?

2
একবার যদি কোনও কোয়েরি সার্ভারে হিট করে তবে এটি চালিয়ে যাবে যতক্ষণ না আপনি সার্ভারে কোয়েরিটি বাতিল করে দেন।
জে পি চৌহান


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

উত্তর:


22

নিক এবং মার্টিন দ্বারা উল্লিখিত হিসাবে, আপনার কোয়েরির চূড়ান্ত স্থিতি এসকিউএল সার্ভার আপনার নেটওয়ার্কের কেবল শেষ হওয়ার আগে আপনার ক্যাবল টান সম্পর্কে জানে কিনা তার উপর নির্ভর করে depends অনলাইন বই থেকে (যদিও আমি আকর্ষণীয় মনে করি যে এর জন্য 2000 , 2005 , 2008 , এবং 2008 আর 2 তে সমতুল্য বিষয় রয়েছে তবে 2012 বা 2014 নয়):

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

(একদিকে যেমন ২ য় শেষ বাক্যে সেই শব্দ সংযোগগুলি সম্ভবত লেনদেনের জন্য বোঝানো হয়েছিল I আমি জানি না কীভাবে কোনও সংযোগটি পিছনে ফিরে আসে))

একইভাবে, এসকিউএল সার্ভার অপ্রত্যাশিতভাবে সার্ভারটি বন্ধ হয়ে যাওয়ার পরে পুনরুদ্ধারের সময় লেনদেনগুলি পূর্বাবস্থায় ফেরানো বা পূর্বাবস্থায় ফিরিয়ে আনতে পারে এবং এটি বন্ধ হওয়ার মুহুর্তে লেনদেনের অবস্থার উপর নির্ভর করবে। আমি দেখেছি লোকে এই কৌশলটি ব্যবহার করে যা করতে চেষ্টা করছিল তা অর্জন করতে (লেনদেন (গুলি) বাতিল করতে এবং সার্ভারটি আবার শুরু করার সাথে সাথে বেশিরভাগ কাজ কেবল পুনরায় করা হয়েছিল (সুতরাং তাদের হাঁটুর ঝাঁকুনির প্রতিক্রিয়ার নেট প্রভাব আরও কাছাকাছি ছিল তারা প্রত্যাশা চেয়ে শূন্য)।

সুতরাং এটির অধীন হওয়ার পরিবর্তে, আতঙ্কের মধ্যে কঠোর জিনিসগুলি না করে নেটওয়ার্ক কেবল লাগানো বা মেশিন বন্ধ করে দেওয়ার পরিবর্তে, আমি ভবিষ্যতে আপনাকে পরামর্শ দিচ্ছি যে গুরুত্বপূর্ণ সিস্টেমগুলির বিরুদ্ধে অ্যাডহক অনুসন্ধান চালানো সম্পর্কে আপনার আরও ভাল শৃঙ্খলা রয়েছে। উদাহরণস্বরূপ, পরিবর্তে:

UPDATE dbo.sometable 
-- where *oops* I forgot this part

এটা আছে:

BEGIN TRANSACTION;

UPDATE dbo.sometable
-- where *oops* I forgot this part

-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

তারপরে, আপডেটটি যদি সত্যিই সঠিক হয় তবে আপনি COMMITঅংশটি হাইলাইট করতে এবং চালাতে পারেন। যদি এটি না হয়, আপনি শান্তভাবেROLLBACK অংশটি হাইলাইট করতে এবং এটি চালাতে পারেন। এমনকি এই বয়লারপ্লেটটি অন্তর্ভুক্ত করতে আপনার টেমপ্লেট সম্পাদনা করতে আপনি এসএসএমএস সরঞ্জাম প্যাকের মতো অ্যাড-ইনগুলিও ব্যবহার করতে পারেন New Query

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

এবং অবশ্যই, বরাবরের মতো, একটি ব্যাকআপ রাখুন যা আপনি নির্ভর করতে পারেন।


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

3
ধন্যবাদ @ নিক, আমার অনুপ্রেরণা লক্ষণ নয়, কারণটির (যে প্রশ্নটি উত্সাহিত করেছিল) সম্বোধন করা ছিল, তবে আমি আমার উত্তর আপডেট করেছি।
অ্যারন বারট্র্যান্ড

8

@ অ্যারন সঠিক। আপনার আদেশগুলি আগে একটি লেনদেন তৈরি করা আপনার সেরা বাজি। যদি আপনি এটি করতে মনে করতে না পারেন তবে একটি বিকল্প হ'ল Tools-Optionsসেটিংসে গিয়ে চালু করা SET IMPLICIT_TRANSACTIONS। নির্দিষ্ট আদেশগুলি চালুর সাথে সাথে এটি স্বয়ংক্রিয়ভাবে একটি লেনদেন শুরু করবে। এর মধ্যে রয়েছে UPDATE, DELETEইত্যাদি এই যে কোনো কমান্ড যে would একটি মোটামুটি সম্পূর্ণ তালিকা উপস্থিত হতে পারে "change"কিছু। SELECTএছাড়াও তালিকায় অন্তর্ভুক্ত রয়েছে এবং willএকটি লেনদেন শুরু করে। আপনি যে আদেশগুলি লেনদেন শুরু করবেন তার পুরো তালিকা দেখতে পাবেন এটি এখানে এই সেটিংটি করবে । এটি ইতিমধ্যে শুরু করা হলে এটি কোনও লেনদেন তৈরি করে না। এখন এর নীচের দিকটি হ'ল যে COMMITকোনও পরিবর্তন করার পরে আপনাকে মনে রাখতে হবে ।

দ্রষ্টব্য: @ হারুনের পরামর্শের ভিত্তিতে আমি এটিতে পুনরায় জোর দিতে চলেছি।

This is very important!  You will have to remember to COMMIT after any change made!

মূলত আপনি কোনও লেনদেনের কথা ভুলে গিয়ে BEGINকোনও কিছু গোলমাল করছেন, কারণ COMMITকোনও লেনদেনের কথা ভুলে যাওয়ার জন্য এবং যদি আপনি এটিকে খোলা রেখে রেখে থাকেন এবং দিনের জন্য ছেড়ে যান তবে এটি ঝুলিয়ে রাখছেন। আমি কেবল আমার জিজ্ঞাসা উইন্ডোটি বন্ধ করে এই পরীক্ষা করেছিলাম যে এটি আমার লেনদেনকে ফিরিয়ে আনবে, তবে যদি আমি লেনদেন করতে বা রোলব্যাক করতে চাই তবে তা আমাকে অনুরোধ জানায়।

এখানে চিত্র বর্ণনা লিখুন


প্রকৃতপক্ষে: একটি লেনদেন শুরু SELECT হবে (যা আপনার পোস্ট করা লিঙ্কটিতেও
নথিযুক্ত

এটি ধরার জন্য @ এ_হর্স_সহ_নো_নাম ধন্যবাদ! আমি যথেষ্ট যত্ন সহকারে পড়িনি এবং একটি পুরানো স্মৃতি বন্ধ ছিল (এটি স্পষ্টত ভুল ছিল)।
কেনেথ ফিশার

1
এটি একটি সহায়ক পোস্ট, তবে কোয়েরিটি চলতে থাকবে কিনা তা আসলে এটি ওপির প্রশ্নের উত্তর দেয় না।
নিক চাম্মাস

2
এটি @ হারুনের উত্তরের যোগ হিসাবে বোঝানো হয়েছিল। এটি একটি মন্তব্য করা ঠিক ছিল।
কেনেথ ফিশার

2

আমি মনে করি এটি সত্যই নির্ভর করে:

যদি আপনি নেটওয়ার্ক কেবলটি প্লাগ লাগানোর আগে কমান্ডটি ইতিমধ্যে সার্ভারে পৌঁছে যায়, কমান্ডটি এখনও স্বাভাবিকভাবে চালানো চালিয়ে যাবে।

সমস্ত আপডেট কমান্ডকে আবশ্যক করার জন্য যদি আপনার কাছে কোনও ট্রানজেকশনস্কোপ থাকে (নেট, অন্যান্য ভাষায় নিশ্চিত নয়) তবে সম্ভবত আপনি যদি লেনদেনস্কোপ.কমপ্লিট () কার্যকর না হয়ে থাকেন তবে কোনও গ্যারান্টি নেই .. ।


2
আপনি বলেছিলেন "যদি আপনি নেটওয়ার্ক কেবলটি প্লাগ লাগানোর আগে কমান্ডটি ইতিমধ্যে সার্ভারে পৌঁছে যায়, কমান্ডটি এখনও স্বাভাবিকভাবে চালানো চালিয়ে যাবে" " এটি এসকিউএল সার্ভার বিওএল পৃষ্ঠা দ্বারা বিপরীত যা মার্টিন উপরে লিঙ্ক করেছেন। "লেনদেন প্রক্রিয়া চলাকালীন ত্রুটি" দেখুন ।
নিক চাম্মাস

তুমি ঠিক. নির্দিষ্ট লেনদেনের সাথে, কমান্ডটি স্বয়ংক্রিয়ভাবে রোল-ব্যাক হবে। তবে যেমনটি আমরা অভিজ্ঞ হয়েছি, যখন কোনও লেনদেন স্পষ্টভাবে নির্দিষ্ট করা হয়নি, কমান্ডটি (লেনদেন ছাড়াই একটি ব্যাচ আপডেট) পুরোপুরি কার্যকর করা হয়েছিল এমনকি আমরা মাঝখানে আমাদের অ্যাপ্লিকেশনটি বন্ধ করে দিয়েছিলাম, যা আসলে সংযোগটি ভেঙে ফেলেছিল - তবে সময় হিসাবে এটি সত্যিকারের উদাহরণ নয় সম্ভবত সঠিক ছিল না। সম্ভবত এটির জন্য কিছু পরীক্ষা করা ভাল
রেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.