Java 使用@Transactional on service方法更新多个存储库
Spring boot,postgres,Spring jpa 拥有一个服务,该服务试图跨多个存储库存储更改:Java 使用@Transactional on service方法更新多个存储库,java,spring-boot,spring-transactions,Java,Spring Boot,Spring Transactions,Spring boot,postgres,Spring jpa 拥有一个服务,该服务试图跨多个存储库存储更改: 类服务{ @交易的 公共空间{ 报告1.删除(……); 报告2.saveAll(…); 报告1.保存(…); } } 如果任何操作失败,则需要回滚此操作 在这里,我突然想到两件事: 如果在该方法的中间添加一个“代码>抛出RunTimeExtExabor ,所有的东西都不会被回滚。 在有规律的流动中,我得到 无法提交JPA事务;嵌套异常为javax.persistence.Rollba
类服务{
@交易的
公共空间{
报告1.删除(……);
报告2.saveAll(…);
报告1.保存(…);
}
}
如果任何操作失败,则需要回滚此操作
在这里,我突然想到两件事:
@Configuration
@EnableTransactionManager
@EntityScan
@EnableJpaRepositories
public class DataConfig {}
还尝试将
TransactionTemplate
bean与它的execute
方法一起使用。设法克服第一个问题,但第二个问题仍然失败。您可以尝试添加@Transactional(rollboor=Exception.class)
这将回滚,即使您的代码中有异常
class Service {
@Transactional(rollbackFor = Exception.class)
public void doStuff() {
repo1.delete(...);
repo2.saveAll(...);
repo1.save(...);
}
}
您可以尝试添加
@Transactional(rollboor=Exception.class)
这将回滚,即使您的代码中存在异常
class Service {
@Transactional(rollbackFor = Exception.class)
public void doStuff() {
repo1.delete(...);
repo2.saveAll(...);
repo1.save(...);
}
}
您使用的是SpringBoot,但是您的配置表明您正在努力解决SpringBoot自动配置问题。也就是说,这真的是您正在使用的代码,还是有一些最终的方法潜伏在您的周围?还有,您使用的是哪种数据库,而不是MySQL与MyISAM表(不支持事务)的偶然关系。如果“arround”指的是EntityScan和JpaRepositories注释,我使用它们将扫描半径减少到特定的包(如果我正确理解它们的用法)。对于DB-这是postgres。对于我正在使用的代码,我确实理解我在spring数据使用中采取了一种旁门左道,但这种方法是一种特殊情况。因此,是的,它是真实的,并且必须保持在相同的路径上。如果数据被持久化并且没有回滚,那么您的
@Transactional
将无法工作。此外,您在提交时出错的事实告诉您一些事情(请添加完整的stacktrace)。所以你一定在做一些你没说的事。同样提到的是,真实代码或伪代码被模拟成部分地模仿真实代码?(你不会是第一个也是最后一个这样做的人,并且在这方面犯了错误,结果一事无成!)。另外,您不需要@EnableTransactionManagement
,因为Spring Boot会处理这个问题。您在stacktrace部分是正确的。我没有意识到我正在进行一些jpa验证,而回滚异常的原因确实是一个验证错误。对于@Transactional
,是的,它不起作用。造成这种情况的原因是,使用同一个bean中的initializebean
测试流是一个坏主意。将删除TransactionManager
,谢谢。您正在使用Spring Boot,但是您的配置表明您正在努力解决Spring Boot自动配置问题。也就是说,这真的是您正在使用的代码,还是有一些最终的方法潜伏在您的周围?还有,您使用的是哪种数据库,而不是MySQL与MyISAM表(不支持事务)的偶然关系。如果“arround”指的是EntityScan和JpaRepositories注释,我使用它们将扫描半径减少到特定的包(如果我正确理解它们的用法)。对于DB-这是postgres。对于我正在使用的代码,我确实理解我在spring数据使用中采取了一种旁门左道,但这种方法是一种特殊情况。因此,是的,它是真实的,并且必须保持在相同的路径上。如果数据被持久化并且没有回滚,那么您的@Transactional
将无法工作。此外,您在提交时出错的事实告诉您一些事情(请添加完整的stacktrace)。所以你一定在做一些你没说的事。同样提到的是,真实代码或伪代码被模拟成部分地模仿真实代码?(你不会是第一个也是最后一个这样做的人,并且在这方面犯了错误,结果一事无成!)。另外,您不需要@EnableTransactionManagement
,因为Spring Boot会处理这个问题。您在stacktrace部分是正确的。我没有意识到我正在进行一些jpa验证,而回滚异常的原因确实是一个验证错误。对于@Transactional
,是的,它不起作用。造成这种情况的原因是,使用同一个bean中的initializebean
测试流是一个坏主意。将删除TransactionManager
,谢谢。这是我的第一个方法,但问题是-我抛出了RuntimeException
,根据@Transactional.rollboor
,默认情况下会捕获它。我确实设法找到了问题的路径,这与AOP更相关-@Transactional
如果在同一个bean中调用,则无法解决(我使用InitializationBean
接口来测试流)。这是我的第一种方法,但问题是-我抛出了RuntimeException
,这,根据@Transactional.rollboor
,默认情况下会捕获。我确实设法找到了问题的路径,它与AOP更为相关-@Transactional
如果在同一个bean中调用,则不会得到解决(我使用InitializationBean
接口来测试流)。