থ্রেড-নিরাপদ উপায়ে কীভাবে কোনও মান (পাল্টা) জিজ্ঞাসা করতে এবং বাড়ানো যায়? (বর্ণের পরিস্থিতি এড়ানো)


10

একটি সারণীতে যেখানে প্রতিটি সারির একটি পাল্টা থাকে (কেবলমাত্র একটি পূর্ণসংখ্যার মান), আমার বর্তমান মান পেতে এবং একই সাথে এটি বাড়ানো দরকার ।

কার্যকরভাবে, আমি এটি করতে চাই:

SELECT counter FROM table WHERE id=123
UPDATE table SET counter=counter+1 WHERE id=123

তবে দুটি ক্যোয়ারী হিসাবে এটি করা সুস্পষ্টভাবে থ্রেড-নিরাপদ নয়: একই জিনিস (একই সারিতে) করা একাধিক প্রক্রিয়া একই পাল্টা মান পেতে পারে। আমার সমস্তগুলি অনন্য হতে হবে, তাই প্রতিটি প্রক্রিয়া প্রকৃত বর্তমান মান পেতে পারে এবং একে একে বাড়িয়ে তোলে

আমি এমন একটি নির্মাণের কথা ভাবতে পারি যেখানে আমি সারি প্রতি ম্যানুয়াল লক প্রয়োগ করি তবে আমি আশ্চর্য হয়েছি যে এটি করার কোনও সহজ উপায় আছে কিনা?


সম্ভবত লেনদেন ব্যবহার করছেন?
ypercubeᵀᴹ

উত্তর:


15

আপডেটের স্টেটমেন্টগুলি আগে নির্বাচন না করে পুরোপুরি সূক্ষ্মভাবে কাজ করে! যেহেতু একক বিবৃতি সংজ্ঞা অনুসারে নিরাপদ, এমনকি একই সময়ে সম্পাদিত দুটি আপডাইয়ের ক্যোয়ারী কেবলমাত্র সারিতে দু'বার বৃদ্ধি পেয়েছে।

যদি আপনি প্রকৃতপক্ষে আপনার পিএইচপি স্ক্রিপ্টের জন্য মানটি নির্বাচন করতে চান তবে এটির সাথে কিছু করুন এবং পরে এই সঠিক পাল্টা মানটি আপডেট করতে চান, আপনি নিম্নলিখিতটি করতে পারেন:

BEGIN;
SELECT `counter` FROM `table` WHERE `id` = 123 FOR UPDATE;
UPDATE `table` SET `counter` = `counter`+1 WHERE `id` = 123;
COMMIT;

এটি একটি নতুন লেনদেন শুরু করে, তারপরে আপনি আপডেট করতে চান এমন সারিগুলি নির্বাচন করে এবং সেগুলিকে একচেটিভাবে লক করে। তারপরে আপনি অন্যান্য ক্লায়েন্টদের বিষয়বস্তু পরিবর্তন করা বা লক করা সারিগুলিতে অ্যাক্সেস না করে চিন্তিত হয়ে নিরাপদে আপডেট করতে পারেন। অবশেষে আপনার পরিবর্তনগুলি করা দরকার।

বিচ্ছিন্নতা স্তর সম্পর্কে আপনার কিছু পড়া উচিত । আপনি সম্ভবত READ UNCOMMITTEDবিচ্ছিন্নতা স্তরের মতো মান চান না । এই ব্যবহারের ক্ষেত্রে অন্য সমস্ত কিছু ঠিক থাকা উচিত।


আমি অন্য জায়গায় পড়েছি যে UPDATE table SET counter = counter + 1পর্যাপ্ত পরিমাণে পারমাণবিক? আপনার চারপাশে লেনদেনের বিবৃতিগুলি এখনও দরকার?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই আপনার জিজ্ঞাসাটি একমাত্র পারমাণবিক, তবে আপনি যদি পূর্বে মানটি নির্বাচন করেন এবং ব্যবহার FOR UPDATEএবং লেনদেন না করেন তবে আপনি যে মানটি নির্বাচন করেছেন তা আপডেট ক্যোয়ারীতে ব্যবহৃত মানের চেয়ে আলাদা হতে পারে। আমার প্রশ্নের সংমিশ্রণটি মানটি নির্বাচন করার সাথে সাথেই সারিটিকে লক করে দেয় এবং তাই নিশ্চিত করে যে এই সঠিক পাল্টা মানটি আপডেট ক্যোয়ারিতে ব্যবহৃত হবে।
ঘোস্টগ্যাম্বিলার

ঠিক আছে, তবে কেবল তখনই প্রয়োজনীয় যদি আমি ডান বাড়ানো ছাড়া অন্য কোনও কাজ করি? এটি যেমন দাঁড়িয়েছে, একা পারমাণবিক আপডেটের ক্যোয়ারী যথেষ্ট যদি আমি কেবল তাই করতে চাই তবে?
সিএমসিডিগ্রাগনকাই

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