是否保证在事务块末尾标记约束违规?

问题描述 投票:0回答:1

我正在使用 Postgres 并定义如下事务方法:

@Entity
public class SomeEntity {
    // …
}

@Transactional(isolation = READ_COMMITED)
public void persistUniqueAndSendEmail() {
    SomeEntity e = // …
    // Persis the entity to Postgres with a unique constraint that may fail

    // Once the entity is persisted send the notification email
}

使用READ_COMMITED隔离级别,是否有可能在事务实际提交时抛出唯一约束冲突,而不是执行实际的sql语句?

如果是这样,则意味着可以发送电子邮件,但相关更改不会保留。

java spring postgresql transactions transaction-isolation
1个回答
0
投票

直到方法结束时事务才完成。在事务完成提示之前,保存不会刷新。所以是的,您可能会遇到约束违规,在发送电子邮件后回滚保存。

您可以尝试调用 saveAndFlush 而不是 save (请参阅Spring data jpa 中 save 和 saveAndFlush 之间的区别)。刷新强制发生数据库调用,这将触发任何约束违规。

但是您不希望交易因其他原因失败并且电子邮件发送错误。安全的做法是确保事务成功完成,然后在调用事务服务的另一个服务中或在 AOP 拦截器中发送电子邮件。

© www.soinside.com 2019 - 2024. All rights reserved.