यूपीएसईआरटी कार्यान्वयन समवर्ती लेखन पहुंच के खिलाफ सुरक्षित होने के लिए बेहद जटिल है। इस पोस्टग्रेस विकी पर एक नज़र डालें जो प्रारंभिक विकास के दौरान लॉग के रूप में कार्य करता था। Postgres हैकर्स ने RETURNING
में "बहिष्कृत" पंक्तियों को शामिल नहीं करने का निर्णय लिया पोस्टग्रेज 9.5 में पहली रिलीज के लिए क्लॉज। वे अगली रिलीज़ के लिए कुछ तैयार कर सकते हैं।
आपकी स्थिति को स्पष्ट करने के लिए मैनुअल में यह महत्वपूर्ण कथन है:
<ब्लॉकक्वॉट>
RETURNING
. का सिंटैक्स सूची SELECT
. की आउटपुट सूची के समान है . केवल सफलतापूर्वक डाली गई या अपडेट की गई पंक्तियां ही लौटाई जाएंगी। उदाहरण के लिए, यदि कोई पंक्ति लॉक की गई थी लेकिन अपडेट नहीं की गई थी, क्योंकि ON CONFLICT DO UPDATE ... WHERE
खंड की स्थिति संतुष्ट नहीं थी, पंक्ति वापस नहीं की जाएगी।
बोल्ड जोर मेरा।
एकल पंक्ति . के लिए डालने के लिए:
एक ही टेबल पर समवर्ती लेखन लोड के बिना
WITH ins AS (
INSERT INTO users(name)
VALUES ('new_usr_name') -- input value
ON CONFLICT(name) DO NOTHING
RETURNING users.id
)
SELECT id FROM ins
UNION ALL
SELECT id FROM users -- 2nd SELECT never executed if INSERT successful
WHERE name = 'new_usr_name' -- input value a 2nd time
LIMIT 1;
टेबल पर संभावित समवर्ती राइट लोड के साथ
इसके बजाय इस पर विचार करें (एकल पंक्ति के लिए INSERT
):
- क्या किसी ऐसे फ़ंक्शन में SELECT या INSERT है जो दौड़ की स्थिति से ग्रस्त है?
पंक्तियों का समूह सम्मिलित करने के लिए :
-
PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?
-
INSERT ... ON CONFLICT से RETURNING में बहिष्कृत पंक्तियों को कैसे शामिल करें
तीनों बहुत विस्तृत विवरण के साथ।