问题标签 [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 - 乐观锁定:需要更新的两个字段
在我们旧的数据库结构中,我们在一个表中有两个字段,当我们更改数据时它们会更新。
不要问。就像是这样:-)
现在我使用 Eclipselink 和 Glassfish v3 实现乐观锁定。
我设法通过使用@Version
注释来增加版本。但是只有当名称字段真正更改时,我才能更新更改的字段。每次只需设置更改的字段,JPA 每次都会更新行。即使名称字段没有真正的变化。而且我不想检查名称字段是否真的被“手”改变了。
我也可以将@Version
注释设置为第二个字段吗?
c# - NHibernate 无法将数据库状态与会话同步
我正在检查 NHibernate 的日志文件,发现随机错误,如下所示:
关于这个问题,我知道这是由于乐观并发而发生的,并且“预计”会发生。我的主要问题是堆栈跟踪 - 它没有说明它发生在“哪里”,它开始了这一行NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecution
。我尝试下载 NHibernate 源代码并查看,但对于为什么没有显示完整的堆栈跟踪没有多大意义。我还有其他类似错误的堆栈跟踪,这些错误使我陷入Transaction.Commit()
困境。有什么想法可以找到实际上引发错误的代码吗?
spring - 多线程中的Spring HibernateTemplate HibernateOptimisticLockingFailureException
当我使用 Spring 中的HibernateTemplate访问mysql数据库时遇到问题。它在单线程环境中工作正常,但它总是抛出关于 多线程中的OptimisticLocking的异常。
详细异常如下图
Mapping.Resource_Movie 源代码显示为
我创建了一个名为com.cmcol.Atom.DatabaseTemplate的类,其中包含来自 Spring autowired 的HibernateTemplate的一个实例。它的代码是
DatabaseTemplate 也会自动装配到其他实例中,但是在多线程环境中会遇到 OptimisticLocking 的问题。
是什么原因以及如何解决?
java - 实体重新加载后仍然抛出 Hibernate 的 StaleObjectStateException
我正在使用具有扩展会话/自动版本控制的标准乐观并发控制方案。我有一个实体,我在第一个事务中加载,呈现给用户进行修改并保存在第二个事务中,两个事务共享同一个会话。session.flush()
在第二个事务结束时以某种方式修改实体之后StaleObjectStateException
,如果检测到版本不一致,则可能会抛出一个错误,这意味着并发事务已在其间保存了实体的下一个版本。
我想以最简单的方式处理这样的错误——只是重新加载丢失当前更改的实体并继续编辑和保存。首先我尝试了这个:
但是在我修改并尝试保存这个刷新的实体之后,我仍然得到相同的StaleObjectStateException
结果,即使它确实被刷新并且版本号看起来是一致的;是的,我知道不鼓励refresh()
在扩展会话中使用,但不明白为什么。这种行为是否与不鼓励它的原因有关?
接下来我尝试了以下方法来避免使用session.refresh()
:
但它仍然会导致在StaleObjectStateException
拯救确实不是陈旧的实体时被提升。
我设法应对异常的唯一方法是:
但与我的具体实体不session.clear()
一样吗?session.evict()
要恢复,我的问题是:
- 除非完成,否则为什么
StaleObjectStateException
仍然会在重新加载的实体上抛出session.clear()
? - 重新加载已在同一会话中加载的实体的正确方法是什么,为什么
refresh()
不好?这种实现对话的方法有问题吗?
我使用的是 Hibernate 4.1.7.Final,没有二级缓存。
如果我的问题重复,我很抱歉,但我找不到深刻的解释......
hibernate - hibernate:乐观并发控制
我正在尝试学习乐观并发控制。
以下程序
- 打开一个会话,在表中创建一行:id=1 name = "raj",提交并关闭会话
- 启动一个线程,最初休眠 3 秒。然后打开 session2,用 name = "raj10" 更新 id = 1 的人。然后 session2 关闭。
- 在 session3 中,我修改了相同的数据库行(id=1)。但问题是,这一行是在步骤 2 中的线程加载相同的数据库行之前加载的。并且在 session3 中,加载的 db 行被更新(现在这是陈旧的,因为 step2 中的线程已经修改了它)。所以我抓住了staleObjectStateException。在 catch 块中,我再次加载它,更新然后保存它。
我得到以下异常:线程“main”中的异常 org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[com.raj.hibernate.optimistic.OptPerson#1]
请告诉我
- 我应该在我的 catch 块中成功更新新值。
session.merge 会在这里帮助我吗?
/li>
hibernate - 最佳实践 Hibernate 乐观锁定和 Web 应用程序
我有一个用 Tapestry5 (java webframework) 和 Hibernate 制作的 web 应用程序。现在我正在尝试添加乐观锁定。所以我添加了一个版本属性并且乐观锁定工作,所以这很容易和快速。
但是由于我的 Web 应用程序使用“每个请求的会话”模式,我不确定利用这种乐观锁定的最佳方式是什么。
怎么了:
UserA 使用加载了 entityA(版本 1)的值的表单打开页面。
UserB 使用加载了来自 entityA(版本 1)的值的表单打开页面。
UserA 更改一些值并提交表单。-> 新请求检索 entityA(版本 1)并提交更改(entityA 现在是版本 2)
UserB 更改一些值并提交表单。-> 新请求检索 entityA(版本2)并提交更改(entityA 现在是版本 3)
应该发生什么
不应提交 UserB 的更改。但是由于 session-per-request 模式,Hibernate 的乐观锁定错误可能发生的时间窗口减少到仅从提交后的新请求到提交的时间跨度,这不是预期的结果。
可能的解决方案
经过一番研究,我发现了以下内容:
- 使用实体版本向表单添加隐藏字段
我可以在提交之前使用这个值来设置实体的版本,但是 Hibernate 文档不建议设置这个值。此外,它仅在实体被分离和重新连接时才有效,因为否则 Hibernate 会忽略手动设置的版本值。
其次,我可以使用此版本值进行手动检查,当呈现表单时,版本是否与提交请求中加载的实体版本相同。如果需要,然后自己抛出一个 OptimisticLockingException。
- 将分离的实体放入 HttpSession 中,因此我不必在提交时再次加载它
结论
这些方法有效,但对我来说似乎不太实用并且容易出错。所以我想知道其他人如何实现这个问题。
java - 如何在 JavaEE 6 中捕获 OptimisticLockException?
我想知道在 JavaEE 6 中捕获的最佳方法是什么OptimisticLockException
。我有以下 EJB:
这是我的 REST 接口:
在 REST 接口中,我捕获了所有异常,此外,我看到OptimisticLockException
如果我从浏览器调用接口,那么为什么 catch-Block 从未执行?
java - 奇怪的事务处理 JavaEE 6
目前我正在研究 JavaEE 6 事务处理,但我有点卡住了。
我模拟了一个研讨会预订引擎,有人可以在其中预订一个或多个人参加研讨会。我的实体如下所示:
这是 EJB:
我的事务监听器如下所示:
问题是,我在后端并行处理 100 个线程并获取如下日志条目:
怎么会有相同的 freeCapacity 值的成功(已提交)事务?
在我看来,第二个和第三个交易应该抛出一个OptimisticLockException
,因为第一个交易已经更新了实体的版本字段。因此,第二个和第三个事务应该已经回滚。
我在这里想念什么吗?我怎么解决这个问题?
java - JPA 中乐观锁定的表索引/pk
为支持乐观锁定的实体定义表索引的最佳实践是什么?
当然,实体 id 必须是数据库中某些索引的一部分,才能通过 id 进行快速查找。版本列呢?将其作为索引的一部分有意义吗?
如果我们不定义数据库主键,而是创建一个由实体 id + 版本列组成的索引怎么办?在数据库中有两行具有相同实体 ID 的风险?假设两个事务并行保留具有相同实体 ID 的两个实体?
session - Stateless bean 与 EntityManager 一起操作可以解决“用户思考时间”的问题
阅读这些笔记。在 EBean 站点页面上。有一段包含:
“使用 EJB3 容器管理 EntityManager 的自然方法是使用有状态会话 Bean。”
还有一个暴露的问题,比如
“如何在“用户思考时间”管理EntityManager?
因此,问题是:EJB 无状态 bean 做什么/提供什么可以解决“用户思考时间”所提到的问题?
我猜 ejb 提供:“会话管理”,但是将会话存储在 ThredLocal 变量上并按需提供给用户有什么问题?并且不要使用EJB。ejb 是否为此提供了一站式解决方案?
我的意思是,文章说:由于这个问题,使用 Session(在休眠中)或 EntityManager 的概念是不好的。因此,它说:根本不需要使用它,除非您使用 EJB 无状态 bean 或者您能够自己提供会话管理机制(这应该很难实现?)