একযোগে সারণী ভিত্তিক সারি কার্যকর করার সর্বোত্তম উপায়


11

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

আমি কীভাবে নিশ্চিত করতে পারি যে প্রতিটি রেকর্ড কেবল একটি অ্যাপ্লিকেশন দ্বারা নেওয়া হয়েছে? রেকর্ডটি পতাকা / লক করার কোনও উপায় আছে কি?

এখনই, একই লিঙ্কটি দু'একটি বাছাই করা এড়াতে, আমি প্রতিটি উদাহরণকে কেবলমাত্র একটি নির্দিষ্ট রেকর্ড (তাদের আইডির এমওডিতে ভিত্তি করে) বাছাই করতে দিচ্ছি, তবে সারি প্রক্রিয়াকরণটি বাড়ানোর কোনও স্বচ্ছ উপায় নয় গতি কেবল নতুন উদাহরণ যুক্ত করে by


আমার মন্ত্র: "এটি সারি করবেন না, কেবল এটি করুন"। এটি হ'ল কোনও কাজকে একটি কাতারে ফেলে দেওয়ার পরিবর্তে, কাজটি করার জন্য একটি প্রক্রিয়া চালু করুন।
রিক জেমস

উত্তর:


8

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

এটি বলার পরে, যদি পারফরম্যান্স / দক্ষতার প্রয়োজনীয়তা খুব বেশি না হয় তবে আমি সফলভাবে এই ধরণের অ্যাক্সেসটি বাস্তবায়ন করতে দেখেছি। অনেক লোক কেবল ব্যবসায়ের যুক্তির একটি ছোট্ট অংশের জন্য প্রযুক্তির একটি সম্পূর্ণ পৃথক টুকরো প্রবর্তন এবং বজায় রাখতে পারে না।

SELECT FOR UPDATEআপনি যা খুঁজছেন- সিরিয়ালাইজেশন পড়ুন। একটি আপডেট / ডিলিট চলমান এমওয়াইএসকিউএল লেনদেনের সময় সর্বদা সারিটি লক করে রাখবে, প্রক্রিয়া চলাকালীন আপনি একটি বৃহত্তর লেনদেন এড়াতে চাইতে পারেন, সুতরাং:

START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING' 
  ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;

// row is processed here, outside of the transaction, and it can take as much time as we want

// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}

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


ধন্যবাদ। আপনি কী ভাবেন যে পারফরম্যান্স একটি বৃহত্তর লক (10 টি এলএমডি পরিবর্তন করে) থেকে উপকৃত হতে পারে?
মিগুয়েল ই

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

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

3

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , মাইএসকিউএল 8 এসকিআইপি লকড এবং কোনও প্রত্যাশা উভয়ের পক্ষে সমর্থন প্রবর্তন করেছে।

স্কাইপ লকড চাকরির সারিগুলি (ওরফে ব্যাচের সারি) বাস্তবায়নের জন্য দরকারী যাতে আপনি অন্যান্য সমবর্তী লেনদেনের দ্বারা ইতিমধ্যে লক থাকা লকগুলি এড়িয়ে যেতে পারেন।

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

স্কিপ লক এবং কোনও অপেক্ষার বিষয়ে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন


0

আমি অফলাইনে ডিবিসিসি চেকগুলির সাথে একই রকম কিছু করেছি (দুটি সার্ভার ব্যাকআপ পুনঃস্থাপন করছে এবং তারপরে একটি ডিবিসিসি চেকডিবি)। একটি সার্ভার গতকাল সমস্ত 31 সার্ভারের ব্যাকআপ সংগ্রহ করে এবং সেগুলিকে একটি কাতারে রাখে এবং তারপরে সেই সার্ভারটি এবং সেই সারি থেকে অন্য একটি টান। প্রচুর সার্ভার না থাকলেও, পদ্ধতিটি একই থাকবে: অ্যাপ্লিকেশন সার্ভারটি সেই অ্যাপ্লিকেশন সার্ভারের নাম বা আরও ভাল এখনও সংখ্যাসূচক আইডি সহ একটি তারিখ / সময় ক্ষেত্র এবং একটি "অ্যাপ সার্ভার" ক্ষেত্র আপডেট করার সারির বিরুদ্ধে একটি আপডেট ক্যোয়ারী চালাও Have এটি একটি লক তৈরি করবে বা যদি পরের সারিটি প্রাপ্ত অন্য কোনও সার্ভার থেকে ইতিমধ্যে কোনও লক রয়েছে, তবে এটি অবরুদ্ধ হয়ে যাবে এবং অন্য অ্যাপ্লিকেশনটির পরের সারিটি শেষ হওয়ার অপেক্ষা করবে। তারপরে আপনি অ্যাপ্লিকেশনটি তার অ্যাপ্লিকেশন ফিল্ডটির জন্য সারিটি থেকে সর্বাধিক সাম্প্রতিক রেকর্ডটি ফিরিয়ে আনতে চান এবং এটি থেকে আপনি যা চান তথ্য পান। মাইএসকিউএল 'ব্যবহার করা হচ্ছে

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