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