spring - 我已将 @Transactional 放入方法中,但它仍然在回滚之前提交事务

标签 spring hibernate spring-boot jpa

如何在Spring中实现事务管理

我的方法如下

@Transactional(rollbackFor = RuntimeException.class, propagation = Propagation.REQUIRED)
@Override
public InwardDTO saveEntity(InwardDTO entity) throws Exception {
    try {
        costCalculation(entity);
        InwardDTO dto = super.saveEntity(entity);
        addStock(dto.getDetails(), dto.getId());
        return dto;
    } catch (Exception ex) {
        throw ex;
    }
}

private void addStock(Set<InwardDetailsDTO> argDetailsDTOSet, Long argInwardId) throws RuntimeException {
    String SUBMODULE = getModuleNameForLog() + " [addStock()] ";

    if (1 == 1) {
        throw new RuntimeException("Test Case");
    }
}

日志就像,

2020-02-29 15:01:14.210 TRACE 14504 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
Hibernate: insert into tbl_inward_chemical (date, invoice_number, is_deleted, party_id, po_id, pre_inward_id_id, remark, slip, total_amount, total_weight) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into tbl_inward_details_chemical (inward_id, is_deleted, is_pass, party_moisture_id, party_ph_id, party_price, party_purity_id, party_solubility_id, party_weight, product_name_id, received_moisture_id, received_ph_id, received_price, received_purity_id, received_solubility_id, received_weight, total_price) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into tbl_inward_details_chemical (inward_id, is_deleted, is_pass, party_moisture_id, party_ph_id, party_price, party_purity_id, party_solubility_id, party_weight, product_name_id, received_moisture_id, received_ph_id, received_price, received_purity_id, received_solubility_id, received_weight, total_price) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2020-02-29 15:01:14.216 TRACE 14504 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2020-02-29 15:01:14.216 TRACE 14504 --- [nio-8080-exec-2] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.alignedorg.chemical.inward.service.InwardService.saveEntity] after exception: java.lang.RuntimeException: Test Case
2020-02-29 15:01:14.216 TRACE 14504 --- [nio-8080-exec-2] o.s.t.i.RuleBasedTransactionAttribute    : Applying rules to determine whether transaction should rollback on java.lang.RuntimeException: Test Case
2020-02-29 15:01:14.216 TRACE 14504 --- [nio-8080-exec-2] o.s.t.i.RuleBasedTransactionAttribute    : Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.RuntimeException]
2020-02-29 15:01:14.222 ERROR 14504 --- [nio-8080-exec-2] c.a.core.utillity.log.ApplicationLogger  :  [ Inward Controller ]  [SAVE] Test Case

java.lang.RuntimeException: Test Case

在此事务中,始终在 addStock 方法回滚之前提交... 在日志中,它显示事务正在回滚,但条目保存在数据库中...

最佳答案

如果表存储引擎是MyISAM:该引擎不支持事务。正确的应该是 InnoDB

如果您使用 Hibernate 自动创建表:我建议您编写自己的迁移并使用类似 Flyway 的工具管理那些。这需要更多的工作,但您可以完全控制表格的外观。

关于spring - 我已将 @Transactional 放入方法中,但它仍然在回滚之前提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60463623/

相关文章:

java - 向 Spring XD 添加自定义类型转换器

java - 我正在将 SpringMVC 用于 Web 应用程序,并将 sessionFactory 用于 Hibernate。以下是我正在使用的 pom.xml

java - 一对多:让 Hibernate 选择引用的 id 而不是加入它

java - 如何使用 @DataJpaTest 和 SpringFox @EnableSwagger2 在 Spring Boot 1.4 中进行切片测试

java - Spring Webjars 定位器和上下文路径

spring - 在已安装并运行 Tomcat 时使用 Spring Framework Web

java.lang.NoClassDefFoundError : org/springframework/web/client/ResponseErrorHandler 错误

java - 配置文件上的 @ConditionalOnProperty 未加载 bean

java - 为什么 hbm2ddl 不喜欢我在 GregorianCalendar 上的 @Temporal 注释?

java - 用于@RequestParam 和 Spring Data REST 的 Spring Converter<S, T>