পিছনে ব্যবহারের কেসটি বুঝতে আমাকে সহায়তা করুন SELECT ... FOR UPDATE
।
প্রশ্ন 1 : নিম্নলিখিত কখন SELECT ... FOR UPDATE
ব্যবহার করা উচিত তার একটি ভাল উদাহরণ ?
প্রদত্ত:
- রুম [ID]
- ট্যাগস [আইডি, নাম]
- রুম_ট্যাগগুলি [রুম_আইডি, ট্যাগ_আইডি]
- রুম_আইডি এবং ট্যাগ_আইডি বিদেশী কী
অ্যাপ্লিকেশনটি সমস্ত কক্ষ এবং তাদের ট্যাগগুলি তালিকাবদ্ধ করতে চায়, তবে অপসারণ করা ঘরগুলির তুলনায় কোনও ট্যাগ নেই এমন কক্ষের মধ্যে পার্থক্য করা দরকার। যদি নির্বাচনের জন্য ... আপডেটের জন্য ব্যবহার না করা হয়, তবে যা ঘটতে পারে তা হ'ল:
- প্রাথমিকভাবে:
- কক্ষ রয়েছে
[id = 1]
- ট্যাগ রয়েছে
[id = 1, name = 'cats']
- রুম_ট্যাগগুলিতে রয়েছে
[room_id = 1, tag_id = 1]
- কক্ষ রয়েছে
- থ্রেড 1:
SELECT id FROM rooms;
returns [id = 1]
- থ্রেড 2:
DELETE FROM room_tags WHERE room_id = 1;
- থ্রেড 2:
DELETE FROM rooms WHERE id = 1;
- থ্রেড 2: [লেনদেন কমিট করে]
- থ্রেড 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
- একটি খালি তালিকা ফেরত দেয়
এখন থ্রেড 1 মনে করে যে রুম 1 এর কোনও ট্যাগ নেই, তবে বাস্তবে ঘরটি সরানো হয়েছে। এই সমস্যাটি সমাধান করার জন্য, থ্রেড 1 টি হওয়া উচিত SELECT id FROM rooms FOR UPDATE
, যার ফলে থ্রেড 2টি rooms
থ্রেড 1 সম্পন্ন হওয়া থেকে মুছে ফেলা থেকে আটকাতে হবে। এটা কি ঠিক?
প্রশ্ন 2 : যখন এক ব্যবহার করা উচিত SERIALIZABLE
বনাম লেনদেন বিচ্ছিন্নতা READ_COMMITTED
সঙ্গে SELECT ... FOR UPDATE
?
উত্তরগুলি বহনযোগ্য হতে পারে (ডাটাবেস-নির্দিষ্ট নয়)। যদি এটি সম্ভব না হয় তবে দয়া করে কেন তা ব্যাখ্যা করুন।
REPEATABLE_READ
এবং READ_COMMITTED
এমনকি পোর্টেবল বিকল্পগুলি কি?
READ COMMITTED
মোডটি আপনাকে অন্য কোনও লেনদেনের দ্বারা প্রতিশ্রুতিবদ্ধ রেকর্ডগুলি দেখতে পাবে কিনা তা নির্ধারণ করে না: এটি কেবলমাত্র নিশ্চিত করে যে আপনি কখনই অনিবন্ধিত রেকর্ড দেখতে পাবেন না।
select ... for update
অন rooms
এখনও room_tags
মুছতে অনুমতি দেবে কারণ সেগুলি পৃথক সারণী। আপনি কি জিজ্ঞাসার অর্থ কি এই for update
ধারাটি থেকে মুছে ফেলা রোধ করবে rooms
?