gpt4 book ai didi

java - 发生异常后,如何使用 PostgreSQL 在 Spring Boot 中继续事务?

转载 作者:搜寻专家 更新时间:2023-11-01 02:37:34 24 4
gpt4 key购买 nike

我创建了一个创建用户帐户的服务方法。如果因为给定的电子邮件地址已经在我们的数据库中而导致创建失败,我想向用户发送一封电子邮件,说明他们已经注册:

@Transactional(noRollbackFor=DuplicateEmailException.class)
void registerUser(User user) {
try {
userRepository.create(user);
catch(DuplicateEmailException e) {
User registeredUser = userRepository.findByEmail(user.getEmail());
mailService.sendAlreadyRegisteredEmail(registeredUser);
}
}

这是行不通的。虽然我将 DuplicateEmailExcepetion 标记为“不回滚”,但第二个 SQL 查询 (findByEmail) 仍然失败,因为事务已中止。

我做错了什么?

存储库中没有@Transactional 注释。

最佳答案

这不是 Spring/JDBC 或您的代码的问题,问题出在底层数据库上。例如,当您使用 Postgres 时,如果事务中的任何语句失败,则所有后续语句都将失败并显示当前事务中止

例如在您的 Postgres 上执行以下语句:

> start a transaction
> DROP SEQUENCE BLA_BLA_BLA;
> Error while executing the query; ERROR: sequence "BLA_BLA_BLA" does not exist"
> SELECT * FROM USERS;
> ERROR: current transaction is aborted, commands ignored until end of transaction block

SELECT 和后续语句仍然有望在 MySQL、Oracle 和 SQL Server 上成功

关于java - 发生异常后,如何使用 PostgreSQL 在 Spring Boot 中继续事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864423/

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