如何在春季回滚交易

时间:2013-09-05 10:42:32

标签: spring transactions

我在使用@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()中发生任何异常,则所有事务都应该回滚但不会发生。任何人都可以告诉我这个问题吗?

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

此致 Bandu

2 个答案:

答案 0 :(得分:0)

对于那些不想抛出异常的人(不应该仅在异常发生时才回滚事务),请使用以下命令:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

答案 1 :(得分:-1)

  

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

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

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