gpt4 book ai didi

java - 使用 Spring Data Repository 限制事务数量

转载 作者:行者123 更新时间:2023-12-02 04:09:18 25 4
gpt4 key购买 nike

我正在使用 Spring 数据存储库编写 Spring Boot 应用程序。我有重置数据库并用示例数据填充它的方法。它可以工作,但是 Spring 使用数百个事务来完成此操作。有什么方法可以将存储库创建的事务数量限制为 1 或根本不使用它们?我想在 fillApplesfillBananas 方法中重用相同的事务。我尝试过使用 @Transactional(propagation = Propagation.SUPPORTS) 的不同组合,但它不会改变任何内容。

interface AppleRepository extends CrudRepository<Apple, Long>
interface BananaRepository extends JpaRepository<Banana, Long>

@Service
public class FruitService{

@Autowired
private final AppleRepository appleRepository;
@Autowired
private final BananaRepository bananaRepository;

public void reset(){
clearDb();
fillApples();
fillBananas();
//more fill methods
}

private void clearDb(){
appleRepository.deleteAll();
bananaRepository.deleteAll();
}

private void fillApples(){
for(int i = 0; i < n; i++){
Apple apple = new Apple(...);
appleRepository.save(apple);
}
}

private void fillBananas(){
for(int i = 0; i < n; i++){
Banana banana = new Banana(...);
bananaRepository.save(banana);
}
}

}


@RestController
public class FruitController{

@Autowired
private FruitService fruitService;

@RequestMapping(...)
public void reset(){
fruitService.reset();
}

}

最佳答案

您必须注释您的 reset()方法 @Transaction以及确保该方法在事务中运行的传播配置(创建或重用现有注释 - 例如传播 REQUIRED (@Transactional 的默认值))

您的代码没有@Transactional但在你的评论中你写道你有一个,但你使用了“错误”Propagation = SUPPORTS 。因为SUPPORTS的含义是:

SUPPORTS Support a current transaction, execute non-transactionally if none exists.

因此,如果没有交易,您将不会创建新交易(@Transactional(propagation = SUPPORTS)永远不会执行任何操作,这意味着对交易不执行任何操作)

所以你必须使用@Transactional(propagation = REQUIRED)

@Transactional(propagation = REQUIRED)
public void reset(){
clearDb();
fillApples();
fillBananas();
//more fill methods
}

@参见:Propagation java doc

关于java - 使用 Spring Data Repository 限制事务数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947356/

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