我创建了一个创建用户帐户的服务方法.如果由于给定的电子邮件地址已经在我们的数据库中而导致创建失败,我想向用户发送一封电子邮件,说明他们已经注册:@Transactional(noRollbackFor=DuplicateEmailException.class)...
我创建了一个创建用户帐户的服务方法.如果由于给定的电子邮件地址已经在我们的数据库中而导致创建失败,我想向用户发送一封电子邮件,说明他们已经注册:
@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中继续事务?
- JSP对URL链接中的中文乱码处理方法总结 2023-08-03
- Java利用钉钉机器人实现发送群消息 2023-05-08
- Java实现读写文件功能的代码分享 2023-04-17
- SpringMVC参数的传递之如何接收List数组类型的数据 2023-06-23
- Java阻塞队列必看类:BlockingQueue快速了解大体框架和实现思路 2023-06-30
- 聊一聊new对象与Spring对bean的初始化的差别 2022-11-02
- Spring Cloud Alibaba负载均衡实现方式 2023-06-06
- MyBatis-Plus实现条件查询的三种格式例举详解 2023-04-17
- Maven Optional依赖属性的含义及妙用 2023-07-15
- SpringMVC参数传递之基本数据类型和复杂对象说明 2023-06-23