आपकी समस्या "सिंक्रनाइज़ेशन लॉक क्या होना चाहिए" . के प्रश्न पर उबलती है . आपके प्रश्न से ऐसा लगता है कि बुकिंग किसी विशिष्ट वस्तु की बुकिंग नहीं है। लेकिन मान लेते हैं, कि एक उपयोगकर्ता एक विशिष्ट होटल के कमरे की बुकिंग कर रहा है, इसलिए आपको दो समस्याओं को हल करने की आवश्यकता है:
- ओवरबुकिंग को रोकें (जैसे दो लोगों के लिए एक ही चीज़ बुक करना)
- समानांतर खाते की स्थिति के गलत आकलन को रोकें
इसलिए जब कोई उपयोगकर्ता उस बिंदु पर पहुंच जाता है, जब वह पुष्टि करें . को हिट करने वाला होता है बटन, यह एक संभावित परिदृश्य है जिसे आप लागू कर सकते हैं:
-
लेन-देन शुरू करें
-
उपयोगकर्ता प्रविष्टि को लॉक करें ताकि समानांतर प्रक्रियाएं अवरुद्ध हो जाएं
SELECT * FROM user FOR UPDATE WHERE id = :id
-
खाते की शेष राशि की फिर से जाँच करें और अपर्याप्त धनराशि होने पर अपवाद / रोलबैक फेंक दें
-
ओवरबुकिंग को रोकने के लिए बुक किए जाने वाले आइटम को लॉक करें
SELECT * FROM room FOR UPDATE WHERE id = :id
-
बुकिंग उपलब्धता की दोबारा जांच करें और अगर आइटम पहले से बुक है तो अपवाद/रोलबैक फेंक दें
-
बुकिंग प्रविष्टि बनाएं और उपयोगकर्ता के खाते से धनराशि घटाएं
-
लेन-देन करें (सभी ताले जारी किए जाएंगे)
यदि, आपके मामले में, आपको ओवरबुकिंग की जांच करने की आवश्यकता नहीं है, तो बस चरण 4 और 5 को छोड़ दें / अनदेखा करें।