异常后交易没有回滚

优素福

我正在运行一个jpa/spring-mvc项目,并在此代码中:

@Autowired
private GenericDao<AoModification, Integer> modif_dao;
....
@Transactional
public void save_ao( ... ) 
        throws ParseException, UnsupportedEncodingException {

    modif_dao.delete(ao.getAoModifications());

    modif_dao.create(new AoModification(
       new SimpleDateFormat("dd/MM/yyyy").parse(mf.date), mf.txt));
    ....

我得到了java.text.ParseException: Unparseable date: "06-10-2011",忘了把它拿走了new SimpleDateFormat("dd-MM-yyyy").parse(mf.date)

问题是我甚至出现了异常,这条线modif_dao.delete(ao.getAoModifications());一直保留在数据库中,交易没有回滚,我失去了所有的钱AoModifications

那么问题出在哪里!

@Repository注释要创建具有自动的方法@Transactional

hibernate.xml

<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>

<tx:annotation-driven transaction-manager="transactionManager" />

dao.GenericDaoJpaImpl.java

@Repository
public class GenericDaoJpaImpl<T, PK extends Serializable> 
                                            implements GenericDao<T, PK> {

    @PersistenceContext
    protected EntityManager entityManager;

    ....

    @Override
    public void delete(T t) {
        this.entityManager.remove(this.entityManager.contains(t) ? t : this.entityManager.merge(t));
    }

    @Override
    public void delete(Set<T> ts) {
        for( T t : ts){
            delete(t);
        }
    }
}
马克西姆·沃蒂亚科夫(Maxim Votyakov)

它不会回滚,因为java.text.ParseException是从java.lang.Exception继承的,而不是从java.lang.RuntimeException继承的。默认情况下,发生RuntimeException时会回滚带有@Transactional批注的方法。

您可以捕获ParseException(或Exception)并重新抛出RuntimeException,例如:

@Transactional
public void save_ao( ... ) {

    try {
        modif_dao.delete(ao.getAoModifications());

        modif_dao.create(new AoModification(
            new SimpleDateFormat("dd/MM/yyyy").parse(mf.date), mf.txt));
        ....
    } catch (Exception e) {
        throw new RuntimeException("Error when saving ao...", e);

    }

或者,您可以使用rollbackFor选项将@Transactional批注修改为回滚异常:

@Transactional(rollbackFor=Exception.class)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有条件的交易回滚

来自分类Dev

春季如何处理交易回滚异常?

来自分类Dev

Rails交易不会回滚

来自分类Dev

Yii交易不会回滚

来自分类Dev

PetaPoco交易未回滚

来自分类Dev

Rails交易不会回滚

来自分类Dev

春季交易,无回滚

来自分类Dev

春季回滚交易部分

来自分类Dev

Rails回滚投标交易

来自分类Dev

外部事务回滚时,内部交易(REQUIRES_NEW)抛出异常

来自分类Dev

我可以在没有回滚的情况下在python金字塔中引发异常吗?

来自分类Dev

更新后回滚

来自分类Dev

Apache ActiveMQ骆驼交易回滚

来自分类Dev

春季交易和多个表的回滚

来自分类Dev

Ruby on Rails-回形针回滚交易

来自分类Dev

此代码的交易和回滚

来自分类Dev

保存交易未发生回滚

来自分类Dev

EF6交易回滚

来自分类Dev

Neo4j-交易回滚

来自分类Dev

数据存储:失败的事务和回滚:如果没有调用回滚或回滚失败会发生什么?

来自分类Dev

如果一个域保存失败,我该如何回滚所有交易?

来自分类Dev

没有发生对象化事务回滚

来自分类Dev

Scrollview.js在回滚时没有'pageChange'事件

来自分类Dev

Rails 4.2迁移错误,但没有回滚

来自分类Dev

回滚后的事务提交

来自分类Dev

提交后的Sqlite回滚

来自分类Dev

BTRFS 回滚后发送

来自分类Dev

NserviceBus 发送后回滚

来自分类Dev

Spring Transactions-防止未经检查的异常后发生回滚(RuntimeException)