स्प्रिंग डेटा 1.6 या अधिक के लिए
@Lock
स्प्रिंग डेटा जेपीए के संस्करण 1.6 के अनुसार सीआरयूडी विधियों पर समर्थित है (वास्तव में, पहले से ही एक मील का पत्थर
उपलब्ध)। यह देखें टिकट
अधिक जानकारी के लिए।
उस संस्करण के साथ आप बस निम्नलिखित की घोषणा करते हैं:
interface WidgetRepository extends Repository<Widget, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Widget findOne(Long id);
}
यह कॉन्फ़िगर किए गए LockModeType को find(…)
पर लागू करने के लिए बैकिंग रिपॉजिटरी प्रॉक्सी के CRUD कार्यान्वयन भाग का कारण बनेगा। EntityManager
पर कॉल करें ।
दूसरी ओर,
स्प्रिंग डेटा 1.6 के पिछले संस्करण के लिए
स्प्रिंग डेटा निराशावादी @Lock
एनोटेशन केवल प्रश्नों पर लागू होते हैं (जैसा कि आपने बताया)। ऐसी कोई टिप्पणियां नहीं हैं जिनके बारे में मुझे पता है जो पूरे लेन-देन को प्रभावित कर सकती हैं। आप या तो एक findByOnePessimistic
. बना सकते हैं विधि जो findByOne
. को कॉल करती है निराशावादी लॉक के साथ या आप findByOne
. को बदल सकते हैं हमेशा निराशावादी ताला पाने के लिए।
यदि आप अपना स्वयं का समाधान लागू करना चाहते हैं तो आप शायद कर सकते हैं। हुड के तहत @Lock
एनोटेशन LockModePopulatingMethodIntercceptor
. द्वारा संसाधित किया जाता है जो निम्न कार्य करता है:
TransactionSynchronizationManager.bindResource(method, lockMode == null ? NULL : lockMode);
आप कुछ स्टैटिक लॉक मैनेजर बना सकते हैं जिसमें एक ThreadLocal<LockMode>
. था सदस्य चर और उसके बाद प्रत्येक भंडार में प्रत्येक विधि के चारों ओर लपेटा एक पहलू होता है जिसे बाइंड रिसोर्स कहा जाता है जिसमें थ्रेडलोकल में लॉक मोड सेट होता है। यह आपको प्रति-थ्रेड आधार पर लॉक मोड सेट करने की अनुमति देगा। फिर आप अपना खुद का @MethodLockMode
. बना सकते हैं एनोटेशन जो विधि को उस पहलू में लपेटता है जो विधि को चलाने से पहले थ्रेड-विशिष्ट लॉक मोड सेट करता है और विधि को चलाने के बाद इसे साफ़ करता है।
संसाधन लिंक:
- Spring Data JPA के साथ निकायों को खोजते समय LockModeType.PESSIMISTIC_WRITE को कैसे सक्षम करें?
- कस्टम कैसे जोड़ें स्प्रिंग डेटा जेपीए के लिए विधि
- Spring Data Pessimistic Lock Timeout with Postgresए>
- JPA Query API
निराशावादी लॉक टाइमआउट के विभिन्न उदाहरण
निराशावादी लॉक सेट करना
एंटिटी ऑब्जेक्ट को लॉक विधि द्वारा स्पष्ट रूप से लॉक किया जा सकता है:
em.lock(employee, LockModeType.PESSIMISTIC_WRITE);
पहला तर्क एक इकाई वस्तु है। दूसरा तर्क अनुरोधित लॉक मोड है।
एक TransactionRequiredException
यदि लॉक को कॉल करने पर कोई सक्रिय लेन-देन नहीं होता है, तो इसे फेंक दिया जाता है क्योंकि स्पष्ट लॉकिंग के लिए एक सक्रिय लेनदेन की आवश्यकता होती है।
एक LockTimeoutException
यदि अनुरोधित निराशावादी ताला नहीं दिया जा सकता है तो फेंक दिया जाता है:
- एक
PESSIMISTIC_READ
लॉक अनुरोध विफल हो जाता है यदि कोई अन्य उपयोगकर्ता (जिसे किसी अन्य EntityManager उदाहरण द्वारा दर्शाया गया है) वर्तमान मेंPESSIMISTIC_WRITE
रखता है उस डेटाबेस ऑब्जेक्ट को लॉक करें। - एक
PESSIMISTIC_WRITE
यदि किसी अन्य उपयोगकर्ता के पास वर्तमान मेंPESSIMISTIC_WRITE
है तो लॉक अनुरोध विफल हो जाता है लॉक याPESSIMISTIC_READ
उस डेटाबेस ऑब्जेक्ट को लॉक करें।
क्वेरी हिंट सेट करना (स्कोप)
क्वेरी संकेत निम्नलिखित क्षेत्रों में सेट किए जा सकते हैं (वैश्विक से स्थानीय तक):
संपूर्ण दृढ़ता इकाई के लिए - persistence.xml
. का उपयोग करके संपत्ति:
<properties>
<property name="javax.persistence.query.timeout" value="3000"/>
</properties>
EntityManagerFactory के लिए - createEntityManagerFacotory
. का उपयोग करके विधि:
Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 4000);
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("pu", properties);
EntityManager के लिए - createEntityManager
. का उपयोग करके विधि:
Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 5000);
EntityManager em = emf.createEntityManager(properties);
या सेटप्रॉपर्टी विधि का उपयोग करना:
em.setProperty("javax.persistence.query.timeout", 6000);
named query
. के लिए परिभाषा - hints
. का उपयोग करना तत्व:
@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c",
hints={@QueryHint(name="javax.persistence.query.timeout", value="7000")})
एक विशिष्ट क्वेरी निष्पादन के लिए - setHint
. का उपयोग करके विधि (क्वेरी निष्पादन से पहले):
query.setHint("javax.persistence.query.timeout", 8000);