gpt4 book ai didi

java - 避免 Spring 中的事务回滚

转载 作者:行者123 更新时间:2023-11-30 07:58:43 24 4
gpt4 key购买 nike

假设我有下一个代码:

@Autowired
private IManager1 manager1;

@Autowired
private IManager2 manager2;

@Autowired
private IManager3 manager3;

@Transactional
public void run() {
manager1.doStuff();
manager2.registerStuffDone();

manager3.doStuff();
manager2.registerStuffDone();

manager1.doMoreStuff();
manager2.registerStuffDone();
}

如果启动任何异常,我想回滚“doStuff()”方法所做的一切,但我不想回滚“registerStuffDone()”方法记录的数据。

我一直在阅读@Transactional 注释的传播选项,但我不明白如何正确使用它们。

每个经理在内部使用 hiberante 来提交更改:

@Autowired
private IManager1Dao manager1Dao;

@Transactional
public void doStuff() {
manager1Dao.doStuff();
}

dao 看起来像这样:

@PersistenceContext
protected EntityManager entityManager;

public void doStuff() {
MyObject whatever = doThings();
entityManager.merge(whatever);
}

这是我的 applicationContext 配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSourcePool" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

想法?

最佳答案

您需要 2 个事务,一个用于提交内容,一个用于回滚内容。

@Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor={Exception1.class, Exception2.class})
public void registerStuffDone()() {
//code
}

然后,您的 run 方法将使用第一个事务并将其回滚,但 registerStuffDone 方法将启动第二个事务,该事务将被提交。

关于java - 避免 Spring 中的事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com