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:अद्यतन के लिए चयन समस्या नहीं है क्योंकि सभी तालिका बंद है।
शायद नौकरी करने का एक और तरीका है - यदि आप न्यूल सेट करने के बजाय पंक्तियों को हटाते हैं और सम्मिलित करते हैं (अन्य तालिका में?) लेकिन मुझे यकीन नहीं है कि कैसे।