क्योंकि गतिरोध इतनी बार होता है, ऐसा लगता है कि एप्लिकेशन के कुछ थ्रेड्स में लंबे समय तक ताले लगे रहते हैं।
डेटाबेस तक पहुँचने के दौरान एप्लिकेशन में प्रत्येक थ्रेड अपने स्वयं के डेटाबेस कनेक्शन / कनेक्शन का उपयोग करेगा, इसलिए डेटाबेस के दृष्टिकोण से दो थ्रेड दो अलग-अलग क्लाइंट हैं जो डेटाबेस लॉक के लिए प्रतिस्पर्धा करते हैं।
यदि एक धागा लंबे समय तक ताले रखता है और उन्हें एक निश्चित क्रम में प्राप्त करता है, और दूसरा धागा उसी ताले को प्राप्त करने के साथ आता है, लेकिन एक अलग क्रम पर, गतिरोध उत्पन्न होता है (देखें यहां इस लगातार गतिरोध के कारण के विवरण के लिए)।
रीड ऑपरेशंस में भी गतिरोध हो रहा है, जिसका अर्थ है कि कुछ थ्रेड रीड लॉक भी प्राप्त कर रहे हैं। ऐसा तब होता है जब थ्रेड REPEATABLE_READ
में लेन-देन चला रहे हों अलगाव स्तर या SERIALIZABLE
।
इसे हल करने के लिए, Isolation.REPEATABLE_READ
के उपयोगों को खोजने का प्रयास करें और Isolation.SERIALIZABLE
परियोजना में, यह देखने के लिए कि क्या इसका उपयोग किया जा रहा है।
एक विकल्प के रूप में, डिफ़ॉल्ट READ_COMMITTED
. का उपयोग करें अलगाव स्तर और @Version
. के साथ संस्थाओं को एनोटेट करें , आशावादी लॉकिंग का उपयोग करके समवर्ती को संभालने के लिए
इसके बजाय।
लंबे समय तक चलने वाले लेन-देन की पहचान करने का भी प्रयास करें, ऐसा कभी-कभी होता है जब @Transactional
गलत जगह पर रखा गया है और उदाहरण के लिए एक बैच प्रोसेसिंग के उदाहरण में पूरी फाइल की प्रोसेसिंग को लाइन दर लाइन लेन-देन करने के बजाय लपेटता है।
इकाई प्रबंधकों के निर्माण/विलोपन को लॉग करने के लिए यह एक log4j कॉन्फ़िगरेशन है और लेनदेन शुरू/प्रतिबद्ध/रोलबैक:
<!-- spring entity manager and transactions -->
<logger name="org.springframework.orm.jpa" additivity ="false">
<level value="debug" />
<appender-ref ref="ConsoleAppender" />
</logger >
<logger name="org.springframework.transaction" additivity ="false">
<level value="debug" />
<appender-ref ref="ConsoleAppender" />
</logger >
- क्या मैं किसी तरह @Transactional के माध्यम से तालिका को लॉक किए बिना अद्यतन क्वेरी (या तो JPA/Native) निष्पादित कर सकता हूं?
अपडेट क्वेरी मूल क्वेरी या JPQL के माध्यम से संभव है। ।
- क्या मैं किसी तरह @Transactional का उपयोग किए बिना सत्र में शामिल हो सकता हूं? उदाहरण के लिए, शेड्यूल किया गया थ्रेड इकाई यील्ड पर आलसी फ़ील्ड को LazyInitializationException को पढ़ने की कोशिश करता है - कोई सत्र नहीं, यदि विधि @Transactional के साथ एनोटेट नहीं की गई है
@Transactional
. के बिना विधियों में , प्रश्नों को इसके स्वयं के इकाई प्रबंधक में निष्पादित किया जाएगा और केवल अलग की गई संस्थाओं को लौटाया जाएगा, क्योंकि क्वेरी चलाने के तुरंत बाद आपका सत्र बंद हो जाता है।
इसलिए @Transactional
. के बिना विधियों में आलसी आरंभीकरण अपवाद यह सामान्य है। आप उन्हें @Transactional(readOnly=true)
. पर सेट कर सकते हैं साथ ही।