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

Hibernate乐观锁定以并发插入吗?

慕逸仙
2023-03-14

在同一个表中的一个并发插入操作中,我得到了ConstraintViolationException。

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: 
could not insert:

Hibernate乐观锁在这方面能帮我吗?据我所知,乐观锁定适用于数据库中同一记录的更新/删除操作。

它也适用于插入查询吗?

我在目标表(实体)中创建了一个版本列。但仍然得到相同的异常(没有乐观的LockException或StaleObjectStateException)。

共有1个答案

岳晟
2023-03-14

乐观锁定用于防止用过时数据覆盖现有数据。由于不能用另一个插入覆盖一个插入,因此执行乐观锁检查没有意义,因为数据库已经抛出了自己的异常-ConstraintViolation异常。如果插入失败,您可以从刷新或提交中获得PersistenceException。如果已经插入了EntityExistsException,则您可以将JPA提供程序配置为在调用persist时抛出EntityexistsExceltion,除非您已经在persist上获得了此项,在这种情况下,您可能会遇到https://hibernate.atlassian.net/browse/HHH-4131

 类似资料:
  • 我知道使用版本列的Hibernate乐观锁定适用于并发更新。当记录被同时删除和重新插入时,它是否有效?

  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 本文向大家介绍Java并发问题之乐观锁与悲观锁,包括了Java并发问题之乐观锁与悲观锁的使用技巧和注意事项,需要的朋友参考一下 首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再

  • 我们有一个系统,我们偶尔会得到一个乐观的锁定异常。我们在代码中已经解决了这个问题,但现在我正在查看JPA 2,并看到它有一个用于处理这个问题的注释(@版本) 我们的问题是,一个表上有多个事务,如果表锁已满,则即使未对相同的记录进行更改,也会导致乐观锁定异常。 我们在JBoss 4.2服务器上使用hibernate,数据库可以是MySQL或SQL服务器。 如果改为使用@Version,这会在两个数据

  • 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,解决方案有两种:乐观锁、悲观锁。 悲观锁在这里不讲,自行Google。 乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,不完整则更新失败。 乐观锁实现方式 使用整数表示数据版本号.更新时检查版本号是否一致,如果相等,则更新成功,且版本号+1.如果不等,则数据已经被修改过,更新失败。 使用时间戳来实现。 本质上也

  • 我有一个这样的方法: 我希望通过使用REQUIRES_NEW事务传播和所示的递归,StaleObjectStateException最终会被清除,但事实并非如此。 如何从此异常恢复?