首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring托管事务、EclipseLink JPA、自定义隔离级别

Spring托管事务、EclipseLink JPA、自定义隔离级别
EN

Stack Overflow用户
提问于 2014-06-18 19:52:25
回答 3查看 1.8K关注 0票数 7

我怀疑这是令人尴尬的,我做错了一个可怕的方式,但请容忍我。

我有一个Spring应用程序,它使用Spring管理的事务。它使用EclipseLink JPA。我有一个方法,它执行一个findByNativeQuery(),然后是一个merge()。我需要这发生在一个真正的串行事务隔离级别。我试着添加@Transactional(isolation=Isolation.SERIALIZABLE)

这不起作用,因为org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect#beginTransaction不支持任何事务隔离级别,但支持默认级别。因此,我尝试进入UnitOfWork内部的ElcipseLink并启动/编写自己的事务,但随后我得到了一个错误:

代码语言:javascript
复制
"java.lang.IllegalStateException : Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead

这当然有道理..。但我该怎么办??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-21 21:02:15

我已经试过了,但我不能完全确定解决方案。我从这个博客中提取了代码,并将其改编为EclipseLink。下面是代码:

代码语言:javascript
复制
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隔离,但这需要进行适当的测试,以确认其工作正常。

票数 6
EN

Stack Overflow用户

发布于 2015-07-14 09:17:10

对自定义隔离级别的支持在Spring4.1.2中添加到EclipseLinkJpaDialect

票数 3
EN

Stack Overflow用户

发布于 2014-06-23 17:52:45

你可以参考

“要使用EclipseLink实现可序列化的事务隔离,我们建议您使用隔离的客户端会话,如下所示:

将数据库事务隔离配置为可序列化。将对象配置为隔离对象(请参见在项目级别配置缓存隔离或在描述符级别配置缓存隔离)。使用UnitOfWork方法beginTransactionEarly (参见工作单元方法beginTransactionEarly)。如果您只关心可序列化的写方面,乐观锁定就足够了。“

http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm或通过http://docs.oracle.com/middleware/1212/toplink/OTLCG/cache.htm,如果任何隔离级别符合您的要求

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24293945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档