当前位置: 首页 > 面试题库 >

事务TransactionImple ActionStatus.ABORTED已回滚

漆雕宏浚
2023-03-14
问题内容

我实现了DTO业务从TomEE到JBoss的迁移。

我有这个实体:

@NamedQueries({
@NamedQuery(name = "common.plagebusiness.plage.getAllPlages", query = "SELECT p FROM Plage p ORDER BY p.plageRgMax, p.plageCReseau") })
@Entity
@Table(name = "PLAGE")
public class Plage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idPlage")
    private Integer idPlage;

    @Column(name = "rgMin")
    private String plageRgMin;

使用此接口:

@Local
public interface PlagePersistenceManager {

public void importPlages(List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException;

}

并执行:

@Stateless(name = "common.plagebusiness.PlagePersistenceManager")
public class PlagePersistenceManagerImpl implements PlagePersistenceManager {

    private static final Logger LOGGER = Logger.getLogger(PlagePersistenceManager.class);

    @PersistenceContext(unitName = "PlageBusiness")
    private EntityManager em;

    @Override
    public void importPlages(final List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException {
        LOGGER.debug("Entree dans importPlages");

        if (null != listeEnregDetail) {
            LOGGER.info("Debut Delete");

            // suppression des plages
            this.deleteAllPlages();

            LOGGER.info("Fin Delete et Debut Insertion en bdd");

            for (final DetailFH55 myEnreg : listeEnregDetail) {
                // insertion des nouvelles plages
                final Plage plage = this.convertEnregDetailToPersist(myEnreg);
                this.em.persist(plage);
            }

            LOGGER.info("Fin Insertion en bdd");
        }

        LOGGER.debug("Sortie dans importPlages");

    }
}

不幸的是,em.persist无法正常工作,我有这个例外:

Caused by: javax.transaction.RollbackException: JBAS014585: Transaction 'TransactionImple < ac, BasicAction: 0:ffff0a48268b:4bc8a0e:56f01b76:18 status: ActionStatus.ABORTED >' was already rolled back

我在论坛上看到这是因为Jboss的超时。我不想更改Jboss的配置,因此我尝试通过输入,

@org.jboss.annotation.ejb.TransactionTimeout(10000000) 
public void importPlages(final List<DetailFH55> listeEnregDetail) throws PlageBusinessException, ParseException

仍然是相同的异常…此代码出了什么问题。

方法deleteAllPlages包含:

@Override
public int deleteAllPlages() throws PlageBusinessException {
    final Query query = this.em.createNativeQuery("DELETE FROM `PLAGE`");
    return query.executeUpdate();
}

我试图将persist()和clear()放在persist(plage)之后,并且仍然是相同的Exception。

final Plage plage = this.convertEnregDetailToPersist(myEnreg);
                this.em.persist(plage);
                this.em.flush();
                this.em.clear();

谢谢


问题答案:

我注意到,您正在使用org.jboss.annotation.ejb.TransactionTimeout,而不是需要EJB3一个:org.jboss.ejb3.annotation.TransactionTimeout

在您的POM中,尝试用此对象替换引用您当前对象的依赖项TransactionTimeout

<dependency>
    <groupId>org.jboss.ejb3</groupId>
    <artifactId>jboss-ejb3-ext-api</artifactId>
    <version>2.2.0.Final</version>
    <scope>provided</scope>
</dependency>

然后,您可以指定值和单位:

@TransactionTimeout(value = 10, unit = TimeUnit.SECONDS).

您可以在JBoss的论坛上找到相关问题。



 类似资料:
  • 问题内容: 我在EJB3无状态会话Bean中使用CMT。另外,我还创建了自己的具有注释“ @ApplicationException(rollback = true)”的异常。 要回滚事务时是否必须使用“ context.setRollbackOnly()”? 我可以通过在bean的public方法内抛出异常来回滚事务吗? 如果是这样(对Q#2的回答是“是”),我是否必须通过在方法中声明异常来将异

  • 我有一个视图,它具有激活viewpager的表格布局,当查看页面时,它工作正常,但如果我单击该视图上的某个项目,然后返回到过去的屏幕,我会得到: Java.Lang.IllegalStateException:FragmentManager已经在执行事务。 不确定这是否有所不同,但当我离开这个视图时,我从一个片段变成了一个活动。

  • 我有这样的场景: 从IncomingMessage表中获取(读取和删除)记录 读取记录内容 在某些表中插入某些内容 如果在步骤1-3中出现错误(任何异常),请将错误记录插入OutgoingMessage表 否则,将成功记录插入OutgoingMessage表 因此步骤1、2、3、4应该在事务中,或者步骤1、2、3、5 但是当SqlCommandHandlerService.persist()抛出异

  • 我正在使用spring-test运行JUnit测试,我的代码如下所示 我的问题是我希望我的测试不影响其他测试。所以我想为每个测试创建一些类似回滚的东西。我为此找了很多,但到目前为止一无所获。我使用Hibernate和MySql来实现这个

  • -ZJ 以下是我在Application.Properties中的数据源设置:

  • 我在Spring Boot应用程序中有一个Javers实现。Mongo4.4被用作数据库。从MongoDB4.4开始,您可以在事务中创建文档。 我在创建对象时模拟了一个异常。如预期的那样,对象没有在数据库中创建,但是一个新的快照被添加到jv_snapshots集合中。 控制器: