कृपया उपयोग के मामले को समझने में मेरी मदद करें SELECT ... FOR UPDATE
।
प्रश्न 1 : निम्नलिखित का एक अच्छा उदाहरण है कि कब SELECT ... FOR UPDATE
इस्तेमाल किया जाना चाहिए?
दिया हुआ:
- कमरे [id]
- टैग [आईडी, नाम]
- Room_tags [room_id, tag_id]
- Room_id और tag_id विदेशी कुंजी हैं
एप्लिकेशन सभी कमरों और उनके टैगों को सूचीबद्ध करना चाहता है, लेकिन जिन कमरों को हटाया नहीं गया है, उन सभी कमरों के बीच अंतर करने की आवश्यकता है। यदि चयन ... के लिए अद्यतन का उपयोग नहीं किया जाता है, तो क्या हो सकता है:
- प्रारंभ में:
- कमरे शामिल हैं
[id = 1]
- टैग शामिल हैं
[id = 1, name = 'cats']
- Room_tags शामिल हैं
[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
यहां तक कि पोर्टेबल विकल्प भी हैं? केवल उन परिणामों के लिए जो मैं प्राप्त करता हूं, वे MSSQL सर्वर के लिए हैं
READ COMMITTED
मोड यह परिभाषित नहीं करता है कि आप वास्तव में किसी अन्य लेनदेन द्वारा किए गए रिकॉर्ड देखेंगे या नहीं: यह केवल यह सुनिश्चित करता है कि आप बिना रिकॉर्ड किए गए रिकॉर्ड कभी नहीं देखेंगे।
select ... for update
पर rooms
अभी भी अनुमति होगी room_tags
, क्योंकि वे अलग-अलग तालिकाओं हैं हटाए जाने के लिए। क्या आपके कहने का मतलब यह है कि क्या इस for update
खंड को हटाने से रोका जाएगा rooms
?