【问题标题】:Spring Transaction propagation nested Propagation REQUIRES_NEW in Propagation.REQUIREDSpring Transaction 传播嵌套 Propagation REQUIRES_NEW 在 Propagation.REQUIRED
【发布时间】:2013-09-09 10:40:34
【问题描述】:

我正在使用 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配置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() 在第一个循环中为空。但是在 ns.inner() 执行之后,我将一些数据插入 db 并提交(我认为 REQUIRES_NEW 有效)。而当第二个循环开始时,dao.findOne 仍然为空,外层 无法获取内部插入数据。为什么??

谢谢!!

【问题讨论】:

  • 当您将外部更改为 Propagation.REQUIRES_NEW 时会发生什么?或者您可以在调用 ns.inner() 之前检查当前事务名称吗?
  • 将代码发布到您的 dao

标签: spring hibernate


【解决方案1】:

已经有一个正在进行的交易,基本上有自己的数据版本。新添加的数据对该事务不可见。除此之外,您还混合使用了 hibernate,它使用缓存并且根据执行的内容,查询仅执行一次,并且在后续调用中它只返回缓存的值(例如在同一事务/会话中)。

链接

【讨论】:

  • 谢谢,dao中的代码很简单,只需要使用SessionFactory .getCurrentSession.createQuery 执行一个选择查询,找出最大的主键记录。插入新记录时,我使用 @Generatedvalue 生成主键 ID。我也尝试在 ns.inner 执行后刷新会话,但它不起作用
  • 刷新只是向数据库发出待处理的语句。您有 2 个独立的事务,通常外部事务不会看到来自内部事务的数据(取决于数据库)。只是为了测试注释您的dao.findOne(),以便它开始一个新的事务。
  • 如果我将内部传播更改为 REQUIRED。它工作正常,在第二个循环中,dao.findOne 不为空。我尝试使用proxy获取执行的sql,发现使用Propagation.REQUIRES_NEW时,执行inner时,spring会向db发送commit,但是为什么outer无法获取“实时”数据??跨度>
  • 最后看看发生了什么,为 spring 启用“DEBUG”日志记录,观察会话被创建/事务提交等。
  • 因为它是 2 个单独的隔离事务和会话,如前所述,启动的事务会查看数据的某个“快照”(如何等等取决于数据库)。如果您在同一个会话中提交/刷新,则数据可用于当前事务,而如果使用新事务则不是。
猜你喜欢
  • 2020-06-12
  • 2012-09-05
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多