我正在使用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语句时抛出唯一约束违规?

如果是这样,这将意味着可以发送邮箱,但相关更改不会持久存在.

推荐答案

该事务直到该方法结束时才结束.在事务完成提示之前,保存不会刷新.因此,是的,您可能会遇到违反约束的情况,从而在发送邮箱后回滚保存.

您可以try 调用saveAndFlush而不是save(参见Difference between save and saveAndFlush in Spring data jpa).刷新强制执行数据库调用,这将触发任何违反约束的操作.

但您不希望事务因其他原因而失败,从而导致邮箱发送错误.安全的做法是确保事务成功完成,然后在调用事务服务的另一个服务中或在AOP拦截器中发送邮箱.

Java相关问答推荐

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

Android -如何修复Java.time.zone. ZoneRulesExcept:未知时区ID:Europe/Kyiv

为什么Java中的两个日期有差异?

Listview—在Android Java中正确链接项目时出错

Javascript在边界中心调整ImageView大小

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

将响应转换为带值的键

Spring Security不允许加载js

Java17支持哪个MapR版本?

AbstractList保证溢出到其他方法

JavaFX标签中的奇怪字符

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

处理4.3问题:javax.xml.ind包不存在(&Q;).您可能在学习GitHub教程时遗漏了库.&Q

在Java Spring JPA中插入包含对其他实体的引用的列

如何在Spring Security中设置一个任何人都可以打开的主页?

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

为什么Spring要更改Java版本配置以及如何正确设置?

如何从指定某些字段的父对象创建子对象