当前位置: 首页 > 知识库问答 >
问题:

REQUIRES_NEW在Spring+Hibernate中不创建新事务

白星海
2023-03-14
@Component
public class Bean1{

@Autowired 
Bean2 bean2;

@Transactional(propagation = Propagation.REQUIRED)
public void foo()
{
    bean2.bar();
}


@Component
public class Bean2{

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void bar()
{
    try{
           // Do something which throws exception
    }
    catch (Exception e) {
        log & eat the exception here only.
        But inspite of this the outer transaciton gets rolled back
    }
}
D| o.s.o.h.HibernateTransactionManager- Creating new transaction with name ... PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''

这意味着没有为内部bean2.bar()创建新事务;

我找不出这里出了什么问题?非常感谢任何帮助。

共有1个答案

杨腾
2023-03-14

REQUIRES_NEW仅适用于JTA事务管理器。请参阅此处的Spring Doc

REQUIRES_NEW
公共静态最终传播REQUIRES_NEW

以非事务性方式执行,如果存在当前事务,则挂起当前事务。类似于同名的EJB事务属性。
注意:实际的事务挂起不会在所有事务管理器上的开箱即用。这特别适用于JtaTransactionManager,它要求javax.transaction.TransactionManager对它可用(这在标准J2EE中是特定于服务器的)。

 类似资料:
  • 在以下代码方法中,更新正确的sql,但sql有一些问题,但是,当我调用doService()时,它必须将更新提交到DB,即使doService 2()有sql异常,因为doService 2()有一个新的传播类型,但是当我取消这个更新时,不会提交DB。。 正如你们的建议,以以下方式进行测试,但仍然面临相同的问题。这里i在一个单独的类中,但即使仍然存在与上述相同的问题

  • 我有一个事务服务调用第二个具有REQUIRES_NEW传播的服务。 激活日志我看到Spring在创建子事务时创建了一个新的Hibernate会话,即使当前线程已经有一个打开的会话。 重用会话难道不是更好的性能明智之举吗?这还可以避免在子事务中重新加载或重新附加对象。我在这里错过了什么? 此行为硬编码在org . spring framework . ORM . hibernate 3 . hibe

  • 下面是我的dispatcher-servlet.xml文件: http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context/spring-context

  • 我正在尝试代码优先的方法来使用Spring、Boot和Hibernate创建数据库。 但是,我现在还做不到。 这是我的控制器

  • 代码: 此控制器调用一个服务: 这个service1调用一个service2,因为我知道Spring Boot AOP是基于代理的,所以我需要另一个bean来切换事务的传播:

  • 问题内容: 我正在使用,并且正在尝试运行一个简单的应用程序,尤其是运行在page中描述的应用程序。我的hibernate.cfg.xml文件是: 我(使用maven时)是: 我在链接中使用它: 但是,不可能获得应用程序的工作,即在数据库中hibernate创建表并插入值。无论尝试如何,我总是会收到相同的错误: 在线上的“关系部门不存在”: 我也没有完全相同的错误尝试过。为了抢占某些读者,请不要在数