2014-06-18 19 views
6

Tôi nghi ngờ điều này là đáng xấu hổ vì tôi đang làm sai một cách khủng khiếp, nhưng hãy chịu đựng với tôi.Các giao dịch được quản lý mùa xuân, EclipseLink JPA, mức cách ly tùy chỉnh

Tôi có một ứng dụng Mùa xuân với các giao dịch do Spring quản lý. Nó sử dụng EclipseLink JPA. Tôi có phương thức thực hiện findByNativeQuery(), sau đó là merge(). Tôi cần điều này xảy ra trong một mức cô lập giao dịch SERIAL thực. Tôi đã thử thêm @Transactional(isolation=Isolation.SERIALIZABLE)

này không làm việc vì org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect#beginTransaction không hỗ trợ bất kỳ mức cô lập giao dịch nhưng mặc định. Vì vậy, sau đó tôi đã cố gắng nhận được để UnitOfWork ruột của ElcipseLink và bắt đầu/comitting giao dịch của riêng tôi, nhưng sau đó tôi nhận được một lỗi:

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

Trong đó tất nhiên có ý nghĩa ... nhưng tôi phải làm gì ??

+1

Hãy xem [này] (http : //www.byteslounge.com/tutorials/spring-change-transaction-isolation-level-example). Tôi đã không thử nó bản thân mình, nhưng trông giống như một nơi tốt để bắt đầu. –

+0

Tôi nghĩ rằng JPA không hỗ trợ các mức cô lập tùy chỉnh. Đây là một hạn chế của JPA, không phải mùa xuân. Nó có thể yêu cầu để thực hiện tùy chỉnh JpaDialect – Chakri

Trả lời

6

Tôi đã thử cách này, nhưng tôi không hoàn toàn chắc chắn về giải pháp. Tôi đã lấy mã từ this blog và điều chỉnh nó cho EclipseLink. Đây là mã:

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; 
    } 
} 

Tôi thấy sự cô lập SERIALIZABLE được ghi lại khi giao dịch được bắt đầu, nhưng điều này cần được kiểm tra đúng để xác nhận nó hoạt động.

+0

cảm ơn, tôi sẽ cho nó một shot. –

+0

Tôi đã gỡ rối mã của mình và vào phương thức 'JpaTransactionManager.doBegin()' và kiểm tra 'ConnectionHandle' mà nó đang thu được để tìm kiếm cá thể MySQL' com.mysql.jdbc.JDBC4Connection' thực tế. Kết nối thực tế được sử dụng thực sự DOES sử dụng mức cô lập được thiết lập cho phương thức đó (javax.sql.Connection.TRANSACTION_SERIALIZABLE). –

+0

Chúng tôi không có thời gian để kiểm tra nó, nhưng tôi nghĩ rằng tôi sẽ cung cấp cho tiền thưởng vì đây là câu trả lời duy nhất với nỗ lực đáng kể đưa vào nó. Nhận thức người đọc trong tương lai - câu trả lời được chấp nhận này chưa được đánh giá đúng đắn. –

0

Bạn có thể tham khảo

"Để đạt được cách ly giao dịch serializable với EclipseLink, chúng tôi khuyên bạn sử dụng một phiên client bị cô lập như sau:.

Cấu hình cô lập giao dịch cơ sở dữ liệu như đối tượng Configure serializable như bị cô lập (xem Cấu hình cách ly bộ nhớ cache ở cấp dự án hoặc định cấu hình bộ nhớ cache cách ly ở cấp mô tả) Sử dụng phương pháp UnitOfWork beginTransactionEarly (xem Unit of Work Method startsTransactionEarly) Nếu bạn chỉ quan tâm đến khía cạnh viết của serializable, khóa lạc quan là đủ . "

tại http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm hoặc đi qua http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm nếu bất kỳ mức độ cô lập đáp ứng yêu cầu của bạn

Các vấn đề liên quan