我正在使用 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语句?
如果是这样,则意味着可以发送电子邮件,但相关更改不会保留。
直到方法结束时事务才完成。在事务完成提示之前,保存不会刷新。所以是的,您可能会遇到约束违规,在发送电子邮件后回滚保存。
您可以尝试调用 saveAndFlush 而不是 save (请参阅Spring data jpa 中 save 和 saveAndFlush 之间的区别)。刷新强制发生数据库调用,这将触发任何约束违规。
但是您不希望交易因其他原因失败并且电子邮件发送错误。安全的做法是确保事务成功完成,然后在调用事务服务的另一个服务中或在 AOP 拦截器中发送电子邮件。