gpt4 book ai didi

java - Spring 管理事务、EclipseLink JPA、自定义隔离级别

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:52 25 4
gpt4 key购买 nike

我怀疑这个很尴尬,我做错了很糟糕,但请耐心等待。

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

这不起作用,因为 org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect#beginTransaction不支持任何事务隔离级别,但默认。因此,我尝试进入 ElcipseLink 的 UnitOfWork 内部结构并开始/提交我自己的事务,但随后出现错误:

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

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

最佳答案

我试过这个,但我不完全确定解决方案。我从 this blog 中获取了代码并将其改编为 EclipseLink。这是代码:

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 隔离,但这需要正确测试以确认它有效。

关于java - Spring 管理事务、EclipseLink JPA、自定义隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24293945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com