问题标签 [optimistic-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 是否可以在 JPA toplink 中进行列级乐观锁定?
我optimistic locking
在 JPA 中研究过,@Version annotation
在 DB 中添加了版本列以及它是如何由EntityManager
etc管理的
文档说(用我自己的话)乐观锁在对象级别是有效的。我可以说确实如此,因为版本定义位于实体类中。
这表示:
userA 选择 row_A (只是 db 表中的一行)
用户 B 选择 row_A
userA 更新用户名列的 row_A (此处版本更改)
userB 更新用户名列的 row_A(抛出 optimisticLockException)
到现在为止还挺好。
但是在第4步考虑,如果
userB update row_A of phoneNumber
例如。
我知道仍然会抛出optimisticLockException,但是有没有办法按列级别而不是对象级别锁定?
对我来说,拥有列级锁会很好,但我也不确定这会带来什么缺点,即使它是可能的。
java - JPA 乐观锁版本处理 - 版本值应该携带到客户端还是?
我想知道如何使用 JPA(toplink Essentials)从服务器到客户端处理实体类中的乐观锁版本属性,反之亦然。
这是场景。
从浏览器用户向服务器发送请求,要求编辑个人用户信息。
服务器处理请求并将结果返回给浏览器。服务器代码如下所示:
EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
用户 u = (User)em.find(User.class, myUserId);
返回你;//响应浏览器
在这里,我的困惑是用户表"version"
有optimistic locking
.
这意味着即使客户端(我或任何人)永远不会使用它,版本字段的值也会被发送回客户端。版本字段将在服务器端代码中使用。
那么将版本号发送给客户端是否正确?因为否则我无法弄清楚如何检查版本号,以防用户点击修改数据的网页上的“更新”按钮。
如果您需要更多说明,请告诉我。
hibernate - Hibernate (JPA):当多个对象被修改和提交时如何处理 StaleObjectStateException
考虑以下场景:一个 Db 事务涉及来自不同表的多行,并带有版本控制。
例如:一个shopLists和products。shopList 可能包含产品(其数量在 shoplist 中)并且产品具有其当前库存。
当我插入编辑 shopList 时,我希望更新 shopList 中这些产品的库存以保持库存一致。
为此,我打开一个事务,插入/更新 shopList,更新每个产品的库存(应用增量),然后提交事务。到现在也没什么大不了的。
然而,其他用户可能已经共同更新了一个或多个产品。甚至更新 shopList 本身。在这两种情况下,我都会在提交事务时收到 StaleObjectStateException。
问题是:有没有办法确定哪个表导致了 StaleObjectStateException?
如果产品导致异常,我可以从数据库中刷新所有涉及的产品,然后重新应用库存增量。这很好。如果 shopList 导致异常,最好将问题简单地报告给用户,以便他可以重新开始。
非常感谢您的帮助。
java - 如果我更新子级,则父级的版本属性不会增加
我将 JPA 2 与 Hibernate 3.x 一起使用。我有两个实体对象 Foo 和 Bar,关系是这样的 -
现在我的问题是,如果我Foo
从like加载entityManager.find(...)
和更新并触发,name
那么Hibernate 会触发更新并仅增加一个版本。从对象的角度来看,它不会改变 Foo 的状态,也不应该增加 Foo 的版本吗?
现在我想删除属性,如果更新,应该增加。我怎样才能做到这一点?Bar
foo.getBar().setName("someAnotherName");
entityManager.merge(foo)
Bar
Bar
version
Bar
version
Foo
Bar
mysql - jpa/spring/hibernate中的简单乐观锁问题
我正在尝试使用重试拦截器实现基本的乐观锁机制。
所以问题是有一个带有属性responseCount 的对象Quiz。如果在测验更新期间抛出乐观锁异常,则将从重试拦截器中再次调用相应的更新方法。
事情是不对的,因为重试方法每次都有相同的版本号,因此无论如何它都会使事务失败。
版本:10
进程A:开始更新测验,版本10 进程B:开始更新测验,版本10 进程B:完成更新测验,版本11 进程A:抛出乐观异常引发更新测验,重试进程A在重试方法中版本始终为10
那我能做什么?它应该自动增加版本以使交易成功
mysql - 关于spring/jpa/hibernate中乐观锁定的简单设计问题
我有一个对象 GeneralKnowledgeTest,它包含很多统计字段(ratingsCount、responsesCount、ratingStars ...),每次用户进行该测试时都会更新这些字段(takeTest() -> 事务方法)。
可能会发生许多用户在同一时间进行相同的测试,所以我正在考虑实现一个乐观锁定(@version)和一个拦截器,在抛出乐观锁定异常的情况下重试 takeTest 方法。
所以,在 takeTest 方法中,我总是得到一个新的 GeneralKnowledgeTest 实例,例如entityManager.find(testId),然后更新它的统计字段。如果抛出乐观异常,拦截器将简单地重试 takeTest 方法,直到它成功。
您对此程序有何看法。对于可能有很多用户尝试进行相同测试的系统,这是实现乐观锁定的好方法吗?
PS。如果抛出乐观锁异常,业务不会承认显示任何警告消息,所以拦截器是必须的,以允许顺利执行......
optimistic-locking - 如何在同一个 TX 中出现 OptimisticLockException 后重试更新
在我的程序中,我需要能够在外部事务更新行后重试行更新。Hibernate/JPA throws OptimisticLockException
,我抓住了。重试后,我尝试通过 JPQL/HQL 从 DB 重新读取该行,但 select 语句生成相同的OptimisticLockException
. 有没有办法重新读取该行的最新版本并在同一事务中更新它?
jpa - openjpa throws optimisticklockexception
I am trying openjpa and jpa. All I have is one entity class as corresponding table in the database. one of the attributes of the entity is username and corresponding row in the db table has varchar2(20). and in my main method what i tried to persist and instance of the entity with username longer than 20. All I am doing is
I tried this, hoping to get some other kind of exception, but I don't why I am getting optimisticklockexception.
I do not have any locking setting. I mean I am using default values for locking property.
Does anybody know what's happening here?
hibernate - 关于乐观锁(Hibernate)的基本问题
我是使用“乐观锁定”机制的新手——我正在使用休眠(在 Jboss 中)和容器管理事务(CMT)。我想在我的实体读取和实体更新之间其他人更新数据库中的同一实体(即行)时处理这种情况。在这种情况下,我想抛出异常..
我已经用 @Version 注释了我的实体 - 比如
现在,我很困惑这是否足以进行版本管理,或者我需要像这样显式调用 EntityManager.lock() api
提前致谢,
nhibernate - nHibernate 和并发检查
我想使用 UnitOfWork 模式使用 nHibernate 3 实现并发检查。
更准确地说:
- 打开新的会话会话,
- 在会话中加载实体,
- 关闭会话,
- 给用户一些时间来编辑加载实体中的数据,
- 打开新会话,
- 更新数据
- 关闭会话。
我正在使用时间戳来版本实体。
这是我的映射文件
我不知道如何在会话上下文中更新实体
在 SQL 中它应该像这样工作
如果 ROWSMODIFIED = 1 则更新成功,否则如果 = 0 则 ConcurrencyException
使用 Linq2Sql 非常简单:创建版本控制列,将实体附加到新的会话上下文并尝试更新。
我怎样才能在 nHiberate 中做到这一点?是否支持?