使用attachDirty(saveOrUpdate)进行休眠事务和并发

时间:2020-11-09 15:41:17

标签: spring spring-boot hibernate concurrency

在以下情况下,当在批处理中调用事务注释方法时,attachDirty saveOrUpdate()总是尝试保留实体。

是否有避免这种主键约束违例异常的方法?我认为如果实体尚未创建,saveOrUpdate()将继续存在,否则将对其进行更新。

我使用此..orUpdate()而不是persist()作为处理这些突发事件的方法。

实际上没有数据损坏。因为第一个saveOrUpdate()确实为每个实体保存了1条记录。由于主键约束冲突,其他持久化被数据库拒绝。

我研究了乐观和悲观的锁定。我了解到这些工作是在获取已经存在的记录之后进行的。这里的实体是新的,不存在。

如何更好地解决这个问题?

Concurrent calls causing attachDirty saveOrUpdate() to always try to save

1 个答案:

答案 0 :(得分:1)

为什么异常是一个问题,您不能忽略它吗?如果您的数据库支持“ upsert”,那么从理论上讲,您可以通过在实体上添加以下注释来使用它:

@org.hibernate.annotations.SQLInsert (sql = "INSERT INTO message_user (user_id) VALUES (?) ON CONFLICT DO NOTHING")