Hibernate 嵌套事务,大神请进! 2C

Hibernate、Spring整合,使用HibernateTransactionManager事务管理器,在使用nested嵌套事务的时候,子事务出错时回滚到savepoint,但是Hibernate并没有把出错的操作移除,导致主事务提交的时候session flush又报错,最终主事务和子事务都回滚了。

环境:Spring3.0.2,Hibernate3.6.0,Mysql5.6;

异常是null id in Album entry (don't flush the Session after an exception occurs)【这个是我自己让它报错的,数据库非空校验不过】,
并不是Transaction rolled back because it has been marked as rollback-only。
代码逻辑大致如下:

 ServiceA {
    @Transactional(propagation = Propagation.NESTED)
    @Override
    public void error() throws Exception {
        A a = new A();
        aDao.save(a);
    }
}

ServiceB {
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void success() throws Exception {
        B b = new B();
        b.setName("456"); 
        bDao.save(b);
        try {
            aService.error();
        } catch (Exception e) {
        // 这里调用的是ServiceA的error,这是不是Dao,目的用于测试嵌套事务。
        }
    }
}

2个回答

yaoIin
jAVA-1O 博客看过了,源码跟过,我问题说到了,回滚到savepoint是正常的,但是Hibernate并没把错误的操作移除,当success方法体的所有代码走完走SpringAOP事务的时候再commit又出错了,明白我在说什么??
3 年多之前 回复

HibernateTransactionManager不支持嵌套事务,DataSourceTransactionManager 才支持spring事务嵌套

yaoIin
jAVA-1O 这个我在AbstractTransactionManager的注释中也看到了,当时不太确定,。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐