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

आशावादी लॉकिंग कतार

आशावादी लॉकिंग के लिए आपको यह जांचने के लिए कुछ साधनों को परिभाषित करने की आवश्यकता है कि पिछली बार देखने के बाद से कोई पंक्ति बदल गई है या नहीं। उदाहरण के लिए, बस एक और पहचानकर्ता जोड़ें:

alter table regions_indexes add version_id integer default 1 not null;

अब एप्लिकेशन कुछ पंक्ति पढ़ता है, उपयोगकर्ता को डेटा दिखाता है और बटन क्लिक होने तक प्रतीक्षा करता है। हमें version_id . का मान याद रखना चाहिए हमें मिल गया।

बटन पर क्लिक करने के बाद, आप सभी आवश्यक गणना करते हैं। जब आप पंक्ति को अपडेट करने के लिए तैयार होते हैं, तो आप पंक्ति को लॉक कर देते हैं और जांचते हैं कि क्या version_id नहीं बदला गया है। यदि ऐसा नहीं है, तो version_id में वृद्धि करें और प्रतिबद्ध। यदि यह है, दुर्भाग्य --- आपको उपयोगकर्ता को ऑपरेशन दोहराने के लिए कहना होगा क्योंकि कोई उससे आगे निकल गया है।

यह इस तरह दिख सकता है (छद्म कोड में):

-- remember version_id
select *
from regions_indexes
where id = ... and resource_type = ...;

-- wait for user click
-- you can wait for a long time, because no lock is yet acquired
...

update regions_indexes
set current_resource = current_resource - ..., version_id = version_id + 1
where id = ... and resource_type = ...
returning version_id;

if new_version_id = old_version_id + 1 then
  -- success, commit
else 
  -- fail, rollback
end if;

लेकिन उच्च संगामिति की स्थिति में आशावादी लॉकिंग अच्छी तरह से काम नहीं करता है। जब संघर्ष दुर्लभ न हों, तो आपको बार-बार लेन-देन फिर से शुरू करने होंगे।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF-8 एन्कोडिंग के वर्ण 0xc286 का WIN1252 में कोई समकक्ष नहीं है .... iconv पोस्टग्रेज़ के साथ रूपांतरण पर क्रैश को पुनर्स्थापित करें

  2. एक्लिप्स हाइबरनेट एप्लिकेशन के भीतर पोस्टग्रेज का उपयोग करके संबंध नहीं मिला

  3. पोस्टग्रेज में साल के हिसाब से मूल्यों के साथ तालिका कैसे बनाएं?

  4. PostgreSQL:PostgreSQL डेटाबेस पर किसी उपयोगकर्ता को सभी अनुमतियां दें

  5. pg_restore विकल्प - PostgreSQL बैकअप और ClusterControl के साथ स्वचालित पुनर्प्राप्ति