问题标签 [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.

0 投票
0 回答
696 浏览

hibernate - Grails乐观锁定奇怪行为

我一直试图让 GORM 在集成测试中抛出乐观锁定错误。之前有人说过,如果不使用多个线程,就不可能测试并发更新错误,但即便如此,我发现我的测试用例的行为令人惊讶:

重新挂载的Widget实例不会持久化到数据库中,但不会抛出异常!

我的测试用例相当做作,但我仍然对结果感到惊讶。

有人可以解释一下吗?

0 投票
1 回答
202 浏览

java - 定义 JPA 行为以再次设置相同的值?

我想知道,如果您为任何属性设置等于值,JPA 是否对该行为有任何定义。我在规范中没有找到任何字眼。

我已经使用 TopLink Essentials 和 Hibernate 进行了测试,如果我从数据库加载实体并再次将属性设置为相同的值,会发生什么情况。

设置相同的值

不会更改版本值。

我可以期望每个实现都有这种行为吗?我不这么认为...

0 投票
1 回答
224 浏览

nhibernate - NHibernate 在乐观的情况下覆盖并发

我已经为并发情况实现了乐观锁定。我已经使用映射文件中的版本属性链接到一个整数。

我的目标是,如果用户试图保存过期的对象,她将可以选择覆盖更改。

我很容易设法让 SaveOrUpdate 抛出异常,但是我现在如何覆盖它,以便如果用户愿意,当前对象会覆盖现有的持久对象,同时仍然更新版本号,而无需手动成员- 将变量复制到非陈旧对象中?

这似乎是一个常规的逻辑场景,但我没有看到任何内置机制。那么这是一个反模式吗?

感谢您的帮助和洞察力。

亲切的问候

LJ

0 投票
2 回答
697 浏览

java - 我应该如何处理 Java MUD 中的持久性?OptimisticLockException 处理

在获得原始开发人员许可的情况下,我正在用 Java 重新实现一个旧的 BBS MUD 游戏。目前我正在使用带有 EJB 会话外观的 Java EE 6 用于游戏逻辑和 JPA 用于持久性。我选择会话 bean 的一个重要原因是 JTA。

我对网络应用程序更有经验,如果你得到一个 OptimisticLockException,你只需抓住它并告诉用户他们的数据已经过时,他们需要重新申请/重新提交。在多用户游戏中一直以“再试一次”来回应会带来可怕的体验。考虑到我希望几个人在战斗中瞄准一个怪物,我认为 OptimisticLockException 的可能性会很高。

我的视图代码(呈现 telnet CLI 的部分)是 EJB 客户端。我应该捕获 PersistenceExceptions 和 TransactionRolledbackLocalExceptions 并重试吗?你如何决定何时停止?

我应该切换到悲观锁定吗?

在每个用户命令过度杀伤后都坚持吗?我是否应该将整个世界加载到 RAM 中并每隔几分钟转储一次状态?

我是否让我的会话外观成为一个 EJB 3.1 单例,它可以作为一个阻塞点,从而消除执行任何类型的 JPA 锁定的需要?EJB 3.1 单例用作多读取器/单写入器设计(您将方法注释为读取器和写入器)。

基本上,对于应用程序中的高并发数据更改,在向用户呈现重新提交/重试提示是不可接受的情况下,最好的设计和 java 持久性 API 是什么?

0 投票
2 回答
1542 浏览

c# - Fluent NHibernate OptimisticLock.None() 导致“字符串 'none' 不是有效的布尔值。”

我正在使用以下映射:

但是当我尝试创建会话时,出现以下异常:

[FormatException:字符串 'none' 不是有效的布尔值。]

[XmlSchemaValidationException:'optimistic-lock' 属性无效-根据其数据类型' http://www.w3.org/2001/XMLSchema:boolean ',值'none'无效-字符串'none'不是有效的布尔值。]

我正在使用 NHibernate 2.1.2.4000 并且我正在使用 Fluent NHibernate 1.0RTM,但尝试了最新版本 636 只是为了确保这不是最近修复的问题或其他问题。

附带说明一下,如果我做错了,我希望能够在不增加版本的情况下对 .Bids 列表进行更改。我在Ayende 的博客上看到了一个例子,它用属性做了我想要的。

0 投票
2 回答
266 浏览

google-app-engine - GAE更新同一实体的不同字段

UserA 和 UserB 分别同时更改 objectA.filedA objectA.filedB。因为他们没有改变同一个领域,人们可能会认为没有重叠。真的吗?或者 pm.makePersistnace() 的实现实际上覆盖了整个对象......很高兴知道......

0 投票
2 回答
3077 浏览

nhibernate - 乐观锁 =“版本”和动态更新 =“真”的 NHibernate 映射正在生成无效的更新语句

我有一个具有分配 ID 的实体“组”,它被添加到聚合中以保持它。这会导致一个问题,因为 NHibernate 无法判断它是新的还是现有的。为了解决这个问题,我更改了映射以使 Group 实体对 sql 时间戳版本列使用乐观锁定。这引发了一个新问题。组有一袋子对象。所以当 NHibernate 刷新一个新组到数据库时,它首先在 Groups 表中创建 Group 记录,然后插入每个子对象,然后更新 Group 记录以更新时间戳值。但是,当映射同时为dynamic-update="true"和optimistic-lock="version"时,完成更新生成的sql是无效的。

这是映射:

当映射同时包含动态更新和乐观锁时,生成的sql为:

这显然是无效的,因为没有 SET 语句。如果我删除动态更新部分,则所有内容都会在此更新语句期间更新。这使得该陈述有效,但相当不必要。

有没有人见过这个问题?我错过了什么吗?

谢谢,史蒂夫

0 投票
1 回答
510 浏览

nhibernate - Castle ActiveRecord 乐观锁定属性

Castle ActiveRecord 可以对属性进行乐观锁定吗?我发现整个类的乐观锁定,而不是单个属性。就我而言,我需要这样做,以便在集合中添加/删除元素不会更新实体的版本号(例如,在不更改任何属性的情况下将 a 添加Product到 a不会增加版本号) .StoreStore

0 投票
1 回答
3327 浏览

java - jdbctemplate and optimistic locking

In the project I'm in Hibernate and Spring jdbctemplate are mixed. I added optimistic locking. Hibernate works great with versioning but now I have to tansform all this jdbctemplate code to use versioning too.

Is there something like LockingJdbcTemplate (like SimpleJdbcTemplate)? I was thinking I could implement a generic update method

Where I could:

  • append version=version+1 to columnSql
  • append version=? to whereSql
  • add version number to correct place within params (separate param is forcing to pass that value)
  • Check that exactly 1 item was updated and throw StaleObjectStateException otherwise

Is there any library that would wrap jdbctemplate and do something similar for me? Don't want to invent something that exists... :)

0 投票
2 回答
2543 浏览

java - 乐观锁批量更新

如何在批量更新中使用乐观锁定?我正在使用SimpleJdbcTemplate单行,我可以构建更新 sql,它增加版本列值并在 WHERE 子句中包含版本。

不幸的是int[] updated = simpleJdbcTemplate.batchUpdate,使用 oracle 驱动程序时结果不包含行数。所有元素都是 -2 表示未知的行数。

除了单独执行所有更新之外,还有其他更高效的方法吗?这些批次平均包含 5 个项目(仅),但可能多达 250 个。