java - Hibernate/Spring - 在事务中回滚事务

标签 java spring hibernate transactional

鉴于此示例代码:

public class MyServiceImpl implements MyService {
    @Transactional
    public void myTransactionalMethod() {
        List<Item> itemList = itemService.findItems();
        for (Item anItem : itemList) {
            try {
                processItem(anItem);
            catch (Exception e) {
                // dont rollback here 
                // rollback just one item
            }     
        }

    }

    @Transactional
    public void processItem(Item anItem) { 
        anItem.setSomething(new Something);
        anItem.applyBehaviour();
        itemService.save(anItem);
    }
}

这是我想要实现的:

  1. 只有 processItem(anItem); 应该在内部发生异常时回滚。
  2. 如果发生异常,myTransactionalMethod 应该继续,这意味着 for-each 应该结束。
  3. 如果异常发生在 myTransactionalMethod 而不是在 processItem(anItem) 中,myTransactionalMethod 应该完全回滚。

有没有不涉及手动管理事务(没有注释)的解决方案?

编辑:我正在考虑使用 @Transactional(PROPAGATION=REQUIRES_NEW),但不知道它是否可以在同一个 bean 中工作。

最佳答案

这是一个常见的误解。 Spring Transactions 是通过代理实现的。代理是您类(class)的包装器。您正在从同一类访问 processItem 方法,即您不通过代理,因此您不会获得任何交易。 I explained the mechanism in this answer几年前。

解决方案:如果你想要嵌套事务,你需要两个单独的 Spring bean,它们都必须由 @Transactional 代理。

关于java - Hibernate/Spring - 在事务中回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268512/

相关文章:

java - YouTubePlayerView 只能使用扩展 YouTubeBaseActivity 作为其上下文的 Activity 创建

java - 用于配置文件组合的 Spring boot YAML 配置

hibernate - GORM启用@NotAudited一对多关系未持久

java.sql.SQLException : [Microsoft][ODBC Microsoft Access Driver] Cannot update. 数据库或对象是只读的

java - 使用 Java(不是命令行)启动时覆盖 JMeter 的默认日志位置

java - Java AtomicReference#getAndSet 的用例是什么?

java - RestEasy 从非 jax-rs 感知类获取主机名

spring - 如何使用 springframework CrudRepository 为每个保存操作动态设置 Couchbase 文档的 TTL?

java - Spring: servlet-mapping -> url-pattern :/* 工作但无法显示

mysql - 尝试从父表中删除时出现 SQLIntegrityConstraintViolationException(使用 Java Spring 和 MySQL)