当前位置: 首页 > 知识库问答 >
问题:

Hibernate事务和并发使用attachDirty

姜志
2023-03-14

在下面的例子中,当在burst中调用事务性带注释的方法时,attachDirtysaveOrUpdate()总是尝试持久化实体。

有没有办法避免这个主键约束冲突异常?我认为如果实体尚未创建,则saveOrUpdate()将持续存在,否则将进行更新。

我用了这个。。或者使用update()而不是persist()来处理这些突发事件。

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

我研究了乐观锁定和悲观锁定。我知道这些工作是在获取一个已经存在的记录之后进行的。这里的实体是新的,而不是现有的。

如何更好地处理这一问题?

共有1个答案

司迪
2023-03-14

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

@org.hibernate.annotations.SQLInsert (sql = "INSERT INTO message_user (user_id) VALUES (?) ON CONFLICT DO NOTHING")
 类似资料:
  • 我有相同的模块,连接数据库运行在两个服务器(后台和前台)。它与同一个数据库连接。 我使用JPA(Hibernate实现)和Spring事务管理。 我有以下问题: 我必须用两个不同字段的最大值1更新表a中的字段a(表a中的字段a,表b中的字段b) 案例1: 更新前 表A fA = 100 tableB fB=102 更新后 表a fA=103 tableB fB=102 案例2: 更新前 表A fA

  • null Redis事务是有限的,无法特定键,并且所有键在上都不被监视;我们仅限于给定客户端上的单个正在进行的事务。 我见过许多redis用户声称lua脚本是他们所需要的全部的线程。甚至redis官方文档也表示,他们可能会删除交易,转而支持lua脚本。然而,有些情况下这是不够的,比如最标准的情况:使用redis作为缓存。 假设我们想从Redis中的持久数据存储中缓存一些数据。下面是一个快速的过程:

  • 我正在尝试用Connector/J和MySql构建一个Java(JDK1.8)应用程序。有人告诉我,Serializable是最高级别,但它会影响性能,所以Serializable并不常用。 但是考虑一下这种情况: 有两个提交将更新同一行的字段(提交A和提交B)。如果A和B同时发生,并且隔离级别不可序列化,则会出现数据竞争,这会导致字段不一致。但在可序列化级别,这两个更新不会同时发生,因此A发生在

  • 问题内容: 在我的应用程序中,有多个步骤,其中将通过多种方法对数据库进行多次提交。例: A呼叫B,再呼叫C。然后B呼叫D。D呼叫E,依此类推。所有这些方法都有一些数据库操作。据我了解(声明式事务管理- 春天推荐的方式),如果 E* 成功完成,则事务(以及 E中的 操作将被提交)。现在,由于某些例外, F 应该导致回滚。我想 从 A 做起的 所有事情都 回滚。是否可以通过声明式事务管理?还是应该使用

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。

  • Hibernate 的事务和并发控制很容易掌握。Hibernate 直接使用 JDBC 连接和 JTA 资源,不添加任何附加锁定行为。我们强烈推荐你花点时间了解 JDBC 编程,ANSI SQL 查询语言和你使用的数据库系统的事务隔离规范。 Hibernate 不锁定内存中的对象。你的应用程序会按照你的数据库事务的隔离级别规定的那样运作。幸亏有了 Session,使得 Hibernate 通过标识