मुझे एक समस्या का सामना करना पड़ रहा है जहां मेरे पास एक ऐसा कार्य है जिसका उद्देश्य कुछ परिस्थितियों पर निर्भर धारावाहिक पहुंच की आवश्यकता है। यह सलाहकार ताले का उपयोग करने के लिए एक अच्छा मामला लग रहा था। हालांकि, काफी भारी भार के तहत, मुझे लगता है कि धारावाहिक पहुंच नहीं हो रही है और मैं फ़ंक्शन के समवर्ती उपयोग को देख रहा हूं।पोस्टग्रेस सलाहकार लॉक के भीतर लॉक समवर्ती निष्पादन
इस फ़ंक्शन का उद्देश्य किसी ईवेंट के लिए "सूची नियंत्रण" प्रदान करना है। मतलब, यह किसी दिए गए कार्यक्रम के लिए समवर्ती टिकट खरीद को सीमित करना है, जैसे कि ईवेंट ओवरलोड नहीं किया जाता है। यह एप्लिकेशन/डेटाबेस के भीतर उपयोग किए जाने वाले एकमात्र सलाहकार ताले हैं।
मुझे लगता है कि कभी-कभी ईवेंट टिकटमैक्स मान की तुलना में किसी ईवेंट में अधिक टिकट होते हैं। ऐसा लगता है कि सलाहकार ताले के कारण यह संभव नहीं होना चाहिए। कम मात्रा के साथ परीक्षण करते समय (या लॉक प्राप्त करने के बाद pg_sleep जैसे मैन्युअल रूप से पेश की गई देरी), चीजें अपेक्षा के अनुसार काम करती हैं।
- Django 1.8.1 (django.db.backends.postgresql_psycopg2 डब्ल्यू/CONN_MAX_AGE 300)
- PGBouncer 1.7.2 (सत्र मोड)
- Postgres:
CREATE OR REPLACE FUNCTION createTicket( userId int, eventId int, eventTicketMax int ) RETURNS integer AS $$ DECLARE insertedId int; DECLARE numTickets int; BEGIN -- first get the event lock PERFORM pg_advisory_lock(eventId); -- make sure we aren't over ticket max numTickets := (SELECT count(*) FROM api_ticket WHERE event_id = eventId and status <> 'x'); IF numTickets >= eventTicketMax THEN -- raise an exception if this puts us over the max -- and bail PERFORM pg_advisory_unlock(eventId); RAISE EXCEPTION 'Maximum entries number for this event has been reached.'; END IF; -- create the ticket INSERT INTO api_ticket ( user_id, event_id, created_ts ) VALUES ( userId, eventId, now() ) RETURNING id INTO insertedId; -- update the ticket count UPDATE api_event SET ticket_count = numTickets + 1 WHERE id = eventId; -- release the event lock PERFORM pg_advisory_unlock(eventId); RETURN insertedId; END; $$ LANGUAGE plpgsql;
यहाँ मेरी वातावरण सेटअप है 9.3.10 अमेज़न आरडीएस पर
अतिरिक्त चर जो मैं ट्यूनिंग की कोशिश की:
- सेटिंग CONN_MAX_AGE 0 pgbouncer निकाला जा रहा है और डीबी
को सीधे जोड़ने मेरी परीक्षण में करने के लिए
हां, यह बिल्कुल समस्या है। लेनदेन स्तर ताले पर स्विचिंग ने इस मुद्दे को हल किया है। धन्यवाद! –