当前位置: 首页 > 知识库问答 >
问题:

Spring@Transactional-如何避免特定异常回滚?

冯枫
2023-03-14

我有以下方法:

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void applyLog(int codFilial, List<LogLojaCentralCompactoEntity> items) {
}

它在内部调用:

@Override
@Transactional(noRollbackFor = PersistenceException.class)
public void apply(LogCompactoEntity entity) {
}

第二个方法有一个try/catch persistenceException。问题是事务回滚,然后到达PersistenceException。

try {
   insert();
}
catch(PersistenceException e)
{
   update();
}

if (acao.equalsIgnoreCase("I")) {
    try {
        insertQuery.executeUpdate();
    }
    catch(PersistenceException e) {
        int affected = updateQuery.executeUpdate();

        if(affected == 0)
            throw new LogApplyException("O insert falhou e o update não afetou registros.");
    }
}

编辑4-更多信息:

1)从apply中删除@transactional,将@transaction仅保留在此异常的applyLog结果上:

javax.persistence.persistenceException:org.hibernate.exception.GenericJDBcException:不能执行语句

@lzagkaretos解决方案是有效的(谢谢),但我想知道在未来的情况下如何处理这一点。

共有1个答案

张星洲
2023-03-14

更新

我认为依靠主键冲突异常来查找是否应该插入或更新记录不是你应该做的事情。您可以使用的另一个实现是在执行之前查找是否已将记录保存在数据库中以执行更新或不执行插入。

例如,如果可以使用spring数据存储库,代码可能如下所示。

public void apply(LogCompactoEntity entity) {

    LogCompactoEntity logCompactoEntity = (entity.getId() == null) ? new LogCompactoEntity() : logCompactoRepository.findOne(entity.getId());
    if (logCompactoEntity == null) {
        logCompactoEntity = new LogCompactoEntity();
    }

    copyProperties(entity, logCompactoEntity);

    logCompactoRepository.save(logCompactoEntity);
}
try {
    insert();
}
catch(PersistenceException e) {
    update();
    throw e;
}
 类似资料:
  • 所需的功能是用于任何未捕获的、向上传播到服务层之外的抛出,以导致回滚。我有点惊讶这不是默认行为,但在谷歌尝试了一下后: 这似乎起作用,除非异常被故意吞下而不被重新抛出。(特定的情况是找不到实体。我想这可以重新设计为不抛出异常,但预计不可避免地会有其他异常-例如,在使用

  • 问题内容: 更新记录时,我反复出现锁定超时超出异常的情况。 我正在使用Java Struts 2.1 Hibernate配置。使用的数据库是MYSQL。 任何人都知道如何解决它。 问题答案: 这里有一些建议: “ 锁定等待超时 ”通常发生在事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。 在大多数情况下,问题出在数据库方面。可能的原因可能是表格设计不当,数据量大,约束等。 请查看这个详

  • 我正在尝试正确地使用ByteBuffer和BigEndian字节顺序格式。。 我有几个字段,我试图把它存储在Cassandra数据库之前放在一个单一的ByteBuffer中。 我将要写入Cassandra的字节数组由三个字节数组组成,如下所述- 现在,我需要快速压缩attributeValue数据,然后再将其存储在Cassandra中- 现在,我将编写,和snappy压缩的一起组成一个单字节数组,

  • 我现在和索纳库贝有矛盾。我有一个validator服务(它检查我通过API接收的DTO是否在Double和String对象(不是原语)中不包含空值)。

  • 从C#开始,当我使用RX并且有背压时,项目会不断地添加到内部队列中,直到应用程序运行内存溢出(据我所知)。 在ReactiveX(RXJava)中,似乎他们采取了不同的立场,在背压开始构建时抛出异常。 这意味着我必须使用类似于onBackpressureBuffer()和在调用时传入一个

  • 本文向大家介绍如何避免回调地狱?相关面试题,主要包含被问及如何避免回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 你可以有以下方式避免回调地狱 模块化:将回调函数转换为独立的函数 使用流程控制库,例如[aync] 使用Promise 使用aync/await 使用来计算生成器或Promise 解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。