नहीं, दस्तावेज गलत है। अकेले लेन-देन का उपयोग करना नहीं . है इस समस्या से बचें। यह केवल गारंटी देता है कि यदि कोई अपवाद होना चाहिए तो पूरे लेनदेन को वापस ले लिया जाता है - ताकि कोई असंगत स्थिति डेटाबेस के लिए जारी न रहे।
से बचने . के लिए यह समस्या आपको तालिका को लॉक करना होगा - लेनदेन के अंदर, क्योंकि लेनदेन के अंत में सभी ताले जारी किए जाते हैं। कुछ इस तरह:
BEGIN;
LOCK TABLE mytbl IN SHARE MODE;
-- do your find_or_create here
COMMIT;
लेकिन यह सब कुछ के लिए एक जादुई इलाज नहीं है। यह एक प्रदर्शन समस्या बन सकता है, और गतिरोध . हो सकता है (समवर्ती लेनदेन पारस्परिक रूप से उन संसाधनों को लॉक करने का प्रयास कर रहे हैं जिन्हें दूसरे ने पहले ही लॉक कर दिया है)। PostgreSQL ऐसी स्थिति का पता लगाएगा और प्रतिस्पर्धी लेनदेन में से एक को छोड़कर सभी को रद्द कर देगा। विफलता पर आपको ऑपरेशन के लिए फिर से प्रयास करने के लिए तैयार रहना चाहिए।
लॉक के बारे में PostgreSQL मैनुअल।
यदि आपके पास बहुत अधिक समरूपता नहीं है तो आप समस्या को अनदेखा भी कर सकते हैं। समय स्लॉट बहुत छोटा है इसलिए वास्तव में ऐसा बहुत कम ही होता है। यदि आप डुप्लीकेट कुंजी उल्लंघन त्रुटि पकड़ते हैं, जिससे कोई नुकसान नहीं होगा, तो आपने इसे भी कवर कर लिया है।