PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेस्क्ल में लॉकिंग के साथ संगति और अपडेट के लिए चयन करें

BEGIN; 
LOCK TABLE slots IN ACCESS EXCLUSIVE MODE; 
UPDATE slots SET job_name = '111' WHERE id IN (SELECT id FROM slots WHERE job_name IS NULL LIMIT 1) RETURNING *;
COMMIT;

ऐसा लगता है कि प्रतिबद्ध पढ़ें में काम करता है। यह केवल sql (आपके कोड के समान) है और इसे एक कॉल (तेज़) में निष्पादित किया जा सकता है।

@ सेठ रॉबर्टसन:यह लॉक टेबल के बिना और लूप के बिना सुरक्षित नहीं है।

यदि एक ही समय में लेन-देन A और लेन-देन B है:A पहली पंक्ति का चयन करेगा और B पहली पंक्ति का चयन करेगा। A पंक्ति को लॉक और अपडेट करेगा, B को A कमिट होने तक प्रतीक्षा करनी होगी। फिर B स्थिति की दोबारा जांच करेगा job_name IS NULL। यह गलत है और बी अपडेट नहीं होगा - बी अगली पंक्ति का चयन नहीं करेगा लेकिन केवल फिर से जांच करेगा और खाली परिणाम लौटाएगा।

@joegester:अद्यतन के लिए चयन समस्या नहीं है क्योंकि सभी तालिका बंद है।

शायद नौकरी करने का एक और तरीका है - यदि आप न्यूल सेट करने के बजाय पंक्तियों को हटाते हैं और सम्मिलित करते हैं (अन्य तालिका में?) लेकिन मुझे यकीन नहीं है कि कैसे।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एडब्ल्यूएस बीनस्टॉक या ईसी2 इंस्टेंस में जियोडजैंगो सपोर्ट के साथ Django की स्थापना

  2. ड्रॉप कॉलम कॉलम संदर्भों को पूरी तरह से नहीं हटाता है - postgresql

  3. PG::ConnectionBad (FATAL:pg_hba.conf होस्ट 172.17.0.1, उपयोगकर्ता XXX, डेटाबेस XXX, SSL बंद के लिए कनेक्शन को अस्वीकार करता है):

  4. समानांतर में कई सरणियों को खोलना

  5. पोस्टग्रेज सीएसवी कॉपी से/आयात सीएसवी हेडर का सम्मान नहीं कर रहा है