अंत में मैं इसे काम करने में कामयाब रहा लेकिन कुछ संशोधनों के साथ। विचार PESSIMISTIC_WRITE के बजाय LockModeType.PESSIMISTIC_FORCE_INCREMENT का उपयोग करना है। इस लॉक मोड का उपयोग करते हुए क्रॉन जॉब्स निम्नानुसार व्यवहार करता है:
- जब पहली नौकरी अपडेट के लिए चयन करती है तो सब कुछ अपेक्षित होता है लेकिन ऑब्जेक्ट पर संस्करण बदल जाता है।
- यदि कोई अन्य कार्य उसी चयन को करने का प्रयास करता है जबकि पहला अभी भी लेन-देन पर है, तो जेपीए एक ऑप्टिमिस्टिक लॉक अपवाद लॉन्च करता है ताकि यदि आप उस अपवाद को पकड़ लेते हैं तो आप सुनिश्चित हो सकते हैं कि इसे रीड लॉक के लिए फेंक दिया गया था।
इस समाधान के कई प्रतिरूप हैं:
- SynchronizedCronJobTask में एक संस्करण फ़ील्ड होना चाहिए और @Version के साथ संस्करण नियंत्रण में होना चाहिए
- आपको OptimisticLockException को संभालने की आवश्यकता है, और इसे लॉक होने पर रोलबैक करने के लिए ट्रांजेक्शनल सर्विस मेथड के बाहर पकड़ा जाना चाहिए।
- IMHO एक गैर-सुरुचिपूर्ण समाधान है, जो केवल उस लॉक से भी बदतर है जहां क्रॉन जॉब्स पिछली नौकरियों के समाप्त होने की प्रतीक्षा करते हैं।