Spring事务传播在Propagation.REQUIRED中嵌套传播REQUIRES_NEW

时间:2013-09-09 10:40:35

标签: spring hibernate

我正在使用Spring 3.2与hibernate 4集成 这是我的代码

@Service
public class MyService{

    @AutoWired
    private NestedServcie ns; 

    @Transactional(propagation=Propagation.REQUIRED)
    public void outer(){

       while(true){

       dao.findOne();    // This method find data from db using hibernate hql

       ns.inner();     // insert some data and commit and loop again.

       }
    }

}


@Service
public class NestedServcie{

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void inner(){
        //here insert some data into db using hibernate
    }

}

这是spring config xml

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

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

这是我的问题 在我运行这个程序之前,db中没有数据,所以dao.findOne()在第一个循环中为null。但是在ns.inner()执行之后,我将一些数据插入db并提交(我认为REQUIRES_NEW可以工作)。当第二个循环开始时,dao.findOne仍为null,外部 无法获取内部插入数据。为什么??

谢谢!

1 个答案:

答案 0 :(得分:1)

已经有一个持续的交易基本上有自己的数据版本。新添加的数据对该事务不可见。接下来你在混合中休眠,它使用缓存并根据执行的内容,查询只执行一次,在后续调用中它只返回缓存的值(例如在同一个事务/会话中)。

链接