2014-06-18 7 views
6

मुझे संदेह है कि यह शर्मनाक है कि मैं इसे एक भयानक तरीके से गलत कर रहा हूं, लेकिन कृपया मेरे साथ सहन करें।स्प्रिंग प्रबंधित लेनदेन, एक्लिप्ससेंक जेपीए, कस्टम अलगाव स्तर

मेरे पास स्प्रिंग-प्रबंधित लेनदेन के साथ एक स्प्रिंग एप्लिकेशन है। यह एक्लिप्ससेंक जेपीए का उपयोग करता है। मेरे पास एक तरीका है जो findByNativeQuery() करता है जिसके बाद merge() होता है। मुझे एक असली सीरियल लेनदेन अलगाव स्तर में होने की आवश्यकता है। मैं @Transactional(isolation=Isolation.SERIALIZABLE)

जोड़ने क्योंकि org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect#beginTransaction किसी भी लेनदेन अलगाव स्तर लेकिन डिफ़ॉल्ट का समर्थन नहीं करता यह काम नहीं करता की कोशिश की। तो फिर मैं ElcipseLink की UnitOfWork internals के लिए हो रही है और शुरू करने/अपने ही लेन-देन comitting की कोशिश की, लेकिन फिर मैं कोई त्रुटि मिलती है:

"java.lang.IllegalStateException : Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead 

निश्चित रूप से कौन सा समझ में आता है ... लेकिन मैं क्या करूँ ??

+1

को वसंत 4.1.2 में जोड़ा गया [इस] पर एक नज़र (http ले लो : //www.byteslounge.com/tutorials/spring-change-transaction-isolation-level-example)। मैंने इसे स्वयं नहीं किया है, लेकिन शुरू करने के लिए एक अच्छी जगह की तरह दिखता है। –

+0

मुझे लगता है कि जेपीए कस्टम अलगाव स्तर का समर्थन नहीं करता है। यह जेपीए की एक सीमा है, वसंत नहीं। इसे कस्टम JpaDialect – Chakri

उत्तर

6

मैंने इसे आजमाया है, लेकिन मुझे समाधान के बारे में पूरी तरह से यकीन नहीं है। मैंने this blog से कोड लिया है और इसे ग्रहण लिंक के लिए अनुकूलित किया है।

package com.byteslounge.spring.tx.dialect; 

import java.sql.SQLException; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceException; 

import org.eclipse.persistence.sessions.UnitOfWork; 
import org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect; 
import org.springframework.transaction.TransactionDefinition; 
import org.springframework.transaction.TransactionException; 

public class CustomEclipseLinkJpaDialect extends EclipseLinkJpaDialect { 

    private static final long serialVersionUID = 1L; 

    private boolean lazyDatabaseTransaction = false; 

    @Override 
    public void setLazyDatabaseTransaction(boolean lazyDatabaseTransaction) { 
     this.lazyDatabaseTransaction = lazyDatabaseTransaction; 
    } 

    @Override 
    public Object beginTransaction(final EntityManager entityManager, 
      final TransactionDefinition definition) 
      throws PersistenceException, SQLException, TransactionException { 

     UnitOfWork uow = (UnitOfWork) getSession(entityManager); 
     uow.getLogin().setTransactionIsolation(definition.getIsolationLevel()); 

     entityManager.getTransaction().begin(); 
     if (!definition.isReadOnly() && !lazyDatabaseTransaction) { 
      uow.beginEarlyTransaction(); 
     } 

     return null; 
    } 
} 

मैं Serializable अलगाव जब लेन-देन शुरू किया जाता है लॉग किया जा रहा दिखाई दे रही है, लेकिन यह यह काम करता है पुष्टि करने के लिए ठीक से परीक्षण किया जाना चाहिए: यहाँ कोड है।

+0

को लागू करने की आवश्यकता हो सकती है, मैं इसे एक शॉट दूंगा। –

+0

मैंने अपना कोड डीबग किया है और 'JpaTransactionManager.doBegin()' विधि में प्रवेश किया है और वास्तविक MySQL 'com.mysql.jdbc.JDBC4Connection' उदाहरण देखने के लिए इसे 'कनेक्शन हैडल' का निरीक्षण किया जा रहा है। वास्तव में उपयोग किया जाने वाला वास्तविक कनेक्शन उस विधि के लिए अलगाव स्तर सेट का उपयोग करता है (javax.sql.Connection.TRANSACTION_SERIALIZABLE)। –

+0

हमारे पास इसका परीक्षण करने का समय नहीं है, लेकिन मुझे लगता है कि मैं बक्षीस दूंगा क्योंकि यह एकमात्र उत्तर है जिसमें महत्वपूर्ण प्रयास किए गए हैं। भविष्य पाठक सावधान रहें - इस स्वीकृत उत्तर का अभी तक शुद्धता के लिए मूल्यांकन नहीं किया गया है। –

0

आप उल्लेख

"EclipseLink साथ serializable लेनदेन अलगाव को प्राप्त करने के कर सकते हैं, तो हम अनुशंसा करते हैं कि आप एक अलग ग्राहक सत्र के रूप में इस का उपयोग करें:।

विन्यस्त के रूप में अलग serializable कॉन्फ़िगर वस्तुओं के रूप में डेटाबेस लेनदेन अलगाव (प्रोजेक्ट लेवल पर कैश अलगाव को कॉन्फ़िगर करना या डिस्क्रिप्टर लेवल पर कैश अलगाव कॉन्फ़िगर करना देखें) यूनिटऑफ वर्क विधि का उपयोग करें ट्रांज़ेक्शनएक्शन (वर्क विधि का यूनिट शुरू करें ट्रांस्सेक्शन इयरली)। यदि आप केवल सीरियलज़ेबल के लेखन पहलू के बारे में चिंतित हैं, आशावादी लॉकिंग पर्याप्त है । "

http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm पर

या के माध्यम से http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm जाना अलगाव स्तर के किसी भी आपके आवश्यकता को पूरा करती है, तो कस्टम अलगाव स्तर के लिए

संबंधित मुद्दे