几个 DAO 层之间的事务?

Posted

技术标签:

【中文标题】几个 DAO 层之间的事务?【英文标题】:Transaction between several DAO layers? 【发布时间】:2010-12-10 17:38:29 【问题描述】:

如下所示,我正在访问另一个 DAO 内部的服务层方法。 (系统中的每一个DAO都是使用HibernateDAOSupport类实现的)

我想在#1 或#2(在下面的代码中注释)失败时回滚事务。 但是当#2 抛出异常时,#1 不会回滚,我可以看到数据库中的条目。

@Transactional(readOnly=false, rollbackFor=DuplicateEmailException.class,DuplicateLoginIdException.class,IdentityException.class,propagation=Propagation.REQUIRES_NEW)
    public void createUserProfile(UserProfile profile)
            throws DuplicateEmailException, DuplicateLoginIdException,
            IdentityException 

        // #1 create principal using Identity Service
        identityService.createPrincipal(profile.getSecurityPrincipal());

        try 
        // #2 save user profile using Hibernate Template
            getHibernateTemplate().save(profile);
         catch (RuntimeException e) 
            throw new IdentityException("UseProfile create Error", e);
        


这里是'IdentityService'的createPrincipal()方法的签名。

public void createPrincipal(Principal principal) throws DuplicateEmailException,DuplicateLoginIdException,IdentityException ;

“IdentityService”中没有配置事务管理

我在这里做错了什么?

【问题讨论】:

identityService.createPrincipal(...) 方法必须创建它自己的事务。它的 DAO 是如何配置的? 那个DAO没有为任何事务配置。(没有事务注释)。 我使用过'Transactional'注解的唯一地方是在DAO上面。 【参考方案1】:

试试Propagation.REQUIRED,而不是Propagation.REQUIRES_NEW

【讨论】:

【参考方案2】:

在通话期间identityService.createPrincipal(profile.getSecurityPrincipal()); 你不是在刷新会话吗? (例如,使用 FlushMode.AUTO 执行查询)

【讨论】:

以上是关于几个 DAO 层之间的事务?的主要内容,如果未能解决你的问题,请参考以下文章

spring事务到底用于service层还是dao层

java小技能:biz层处理dao层的事务

服务层和 dao 层中的事务性

服务层和 DAO 层中的 Spring 事务

带有理解的Scala事务块

马士兵Spring-声明式事务管理-annotation