0

我在使用 @Transactional 注释进行事务回滚时遇到问题。

我在 backingbean、service 和 dao 类中有以下方法:

public class ItemBackingBean {
    public void saveUpdate() {
        try {
            ItemService.executeTransaction();
        }
        catch(Exception e) {
        }
    }
}

public class ItemService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void executeTransaction() {
        deleteItem();
        createOrder();
    }

    private void deleteItem() {
        persist();
    }

    private void createOrder() {
        persist();
    }

    private void persist() {
        JpaDaoImpl.persist(object);
        JpaDaoImpl.update(object);
    }
}

public class JpaDaoImpl implements JpaDao {
    @Transactional(readOnly = true)
    public persist(Object object) {
        getEm().persist(object);
    }

    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void update(Object object) {
        getEm().merge(object);
    }

    @Transactional(readOnly = true)
    public void remove(Object object) {
        getEm().remove(object);
    }
}

如果 createOrder() 中发生任何异常,所有事务都应该回滚,但它没有发生。任何机构都可以告诉我这个问题吗?

JpaDaoImpl.java 中@Transactional 的影响是什么?persist() 和 update() 方法具有不同的 radOnly 值。这个 Dao 是我们项目中的现有代码,我们不想更改它。有人可以帮忙吗?

问候, 班杜

4

2 回答 2

1

对于那些不想抛出异常的人(事务不应该只在发生异常时回滚),使用这个:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

于 2019-04-12T11:18:36.127 回答
-1

如果 createOrder() 中发生任何异常,所有事务都应该回滚,但它没有发生。任何机构都可以告诉我这个问题吗?

回滚仅针对 RuntimeExceptions 发生(请参阅http://docs.spring.io/spring/docs/2.0.8/reference/transaction.html “请注意,Spring 框架的事务基础结构代码默认情况下仅将事务标记为在运行时回滚,未经检查的异常;") 但它是可自定义的行为

如果您想要 ALL 或 NOTHING 行为,您可以保留默认的事务传播 PROPAGATION_REQUIRED 而不会影响现有代码

于 2014-08-05T15:41:30.770 回答