问题标签 [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 投票
11 回答
443452 浏览

sql-server - 乐观与悲观锁定

我了解乐观锁定和悲观锁定之间的区别。现在有人可以向我解释我什么时候会使用其中任何一个吗?

这个问题的答案是否会根据我是否使用存储过程来执行查询而改变?

但只是为了检查,乐观的意思是“阅读时不要锁定表格”,悲观的意思是“阅读时锁定表格”。

0 投票
3 回答
1351 浏览

php - CakePHP 是否支持乐观锁定?

我刚开始使用 CakePHP,我找不到任何支持实现乐观锁定方案。我能找到的最接近的是对这个CakePHP 博客文章的评论,说它在 2008 年 6 月不受支持。

有谁知道这是否发生了变化,或者是否有人发布了关于如何自己实现它的扩展或教程?

有关乐观锁定的描述,请参阅此答案

0 投票
3 回答
2490 浏览

activerecord - 为什么activerecord乐观锁定每行只工作一次?

不知何故,我总是在星期五得到这些。

我之前的问题是关于同样的问题,但我现在可以缩小范围:

我整天都在玩这个,试图理解它。我有一个带有 lock_version 列的表,指定如下:

我做这样的事情:

然后我验证第一个和第二个引用同一个对象 - 它们的 ID 相同,并且我使用 mysql 命令行工具在数据库中看到该行。

到目前为止没有问题。我正确地得到了一个 ActiveRecord::StaleObjectError 异常。 但是

……什么也没有发生。事实证明,我唯一一次得到正确(抛出异常)行为是当 first 和 second 的 lock_version 为 0 时。但是,在第一次保存之后,它不再是 0。这到底是怎么回事?

我正在使用 ruby​​ 1.8.6 和活动记录 2.2.2

谢谢...

0 投票
1 回答
654 浏览

asp.net-mvc - 附加场景中的 linq datacontext GetModifiedMembers

我正在尝试在 asp.net MVC 应用程序中实现乐观锁定,并提供审计跟踪。

审计框架依赖于能够在 SubmitChanges 期间调用 DataContext.GetModifiedMembers,我猜这很有意义。

乐观锁定使用 ROWVERSION 时间戳,序列化为 base64 并放入视图中的隐藏字段。

我的编辑操作如下所示:

执行此操作时,DataContext.GetModifiedMembers 将始终返回 MyType 上的所有属性,而不仅仅是在数据库和提供的值之间更改的属性,这会破坏审计。具体来说,它将每个属性都从它们的新值更改为新值,所以它甚至不像我可以对列表做任何聪明的事情。

我尝试先加载对象,然后再附加它,但这会产生重复键异常。

然后我尝试使用UpdateModel,即

这适用于审计,但无法通过乐观锁定。而不是 ChangeConflictException 我得到一个 InvalidOperationException 因为 UpdateModel 正在更改 concurrentTS 字段(这显然是只读的)。

我究竟做错了什么?

0 投票
1 回答
511 浏览

asp.net - 关于如何在浏览器(javascript)和服务器(asp.net web 服务/数据库)之间保持对象映射同步的输入?

我的服务器上有一个对象映射(代表客户、订单、项目的对象,彼此相关,基于数据库中的内容)并且希望在用户正在操作的浏览器中保持该对象映射的最新版本并查看数据。

由于更多的用户可以同时访问和修改同一个对象映射,我需要一种方法来使客户端与服务器保持同步。

我的服务器环境基于.net/asp.net 3.5 sp1,客户端需要在浏览器(html/javascript)中运行。我正在考虑使用 asp.net ajax 4.0,因为它在客户端具有数据绑定功能和可观察的集合,并在服务器上使用诸如 .net ria 服务或 ado.net 数据服务之类的东西。

如果有人有任何经验或知道博客文章/教程/研究论文/文章/你的名字,关于这个话题,我真的很感激一个链接或评论。

最好的问候,埃吉尔。

0 投票
2 回答
3525 浏览

linq-to-sql - 从 XPO 迁移到 LINQ 到 SQL 的提示

我是 DevExpress XPO 库的长期用户。它有很多很棒的功能,但也有一些弱点:

  1. 保存现有对象时,所有属性都在更新查询中发送;更改是基于每个对象而不是每个属性来跟踪的。
  2. 乐观锁定是在每个对象的基础上完成的,而不是每列。
  3. 当发生乐观锁定异常时,不会提供描述冲突性质的上下文;您唯一真正的反应是使操作失败或重现它并在循环中重试。
  4. LINQ 对 XPQuery 的支持非常弱(至少在我们正在使用的 8.1 中)。因此,您经常被迫使用不是类型安全的 XPView 或 XPCollection,它可能返回您不一定需要的列。

在阅读了 LINQ to SQL 如何实现优化锁定和处理更新冲突之后,我被卖了!我喜欢它如何实现列级乐观锁定并且不需要向表中添加列。能够检查和处理冲突的确切性质是很棒的。他们跟踪每列更改的事实应该使其更新查询更加高效。

当然,我还没有在实际应用中使用过LINQ to SQL,所以我不知道它在现实中的比较。此外,我不清楚它是否具有我们喜欢 XPO 的某些功能的类似物,例如:

  1. 自动模式更新(我们相信对象设计驱动数据库结构而不是相反,这大大简化了软件部署)
  2. 如何实现继承的两个选项(同表或一对一的表关系)
  3. 支持内存存储(尽管我认为我们可以在单元测试中将 LINQ 替换为对象)
  4. 存储提供程序自定义(允许我们向 XPO 查询添加 NOLOCK 支持)

我们将进行探索性的部分迁移,我们将暂时将两个 ORM 用于代码的不同部分。你们中的任何人都有使用 XPO 和 LINQ to SQL 的实际经验吗?他们在实践中如何比较?具体来说,您是否知道 LINQ to SQL 缺少的任何会为代码迁移带来挑战的功能?

哦,我什至应该关心 LINQ to Entities 吗?它看起来比我们需要的任何东西都要复杂得多。

0 投票
2 回答
1617 浏览

hibernate - Hibernate 的@Version 可以考虑相关实体的变化吗?

我有 2 个实体:Parent并且Child是一对多的关系。这Parent是版本化的,即有一个@Version 字段。我的目标是同步对's 版本上的实体ParentChild实体的更改。Parent

例如,一个线程更新了一个线程Parent,另一个线程更新了其中一个线程Child,这应该会导致 OptimisticLockException。

可能吗?

我尝试添加一个 @PreUpdate 来Child增加它的版本Parent,但这并没有帮助,因为 Hibernate 似乎只有在它检查版本之后才执行侦听器,因此无论如何事务都会成功提交。

如果可能,如何实施?

0 投票
1 回答
15374 浏览

java - 前端如何使用Hibernate乐观锁版本属性?

使用实体的版本属性的乐观锁定工作正常并且易于实现:

该实体具有以下类型的属性:

到现在为止还挺好。现在服务方法为上面的实体返回一个数据传输对象 (DTO),视图以 HTML 格式显示。对于更新页面,VERSION 属性存储在 HTML 隐藏字段中并与表单一起提交。

目的是使用 version 属性来确保如果显示的信息伴随着旧版本,用户的更新将失败。

控制器通过调用包含更新信息(包括版本属性)的 DTO 的服务方法来响应用户更新请求,而服务方法又使用数据访问对象 (DAO) 来持久化更改:

问题是通过 copyProperties(...) 复制到实体中的版本属性不受 Hibernate 的尊重。我在以下论坛中找到了原因:https ://forum.hibernate.org/viewtopic.php?f=1&t=955893&p=2418068

简而言之,当调用 load() 时,Hibernate 将 version 属性缓存在 session 缓存中,随后将其值更改为什么都没有关系。我同意这是正确的行为,但是 Bosses 指示我通过 HTML 表单属性传递版本(如果有更好的模式,我很想听听)。

我现在正在探索的一种解决方案是在更新发生之前使用 hibernateTemplate.evict(simpleEntity) 设置它的版本后从会话中逐出实体。我希望这可行,但似乎效率不高。

我想要求 Hibernate 检查实例本身的版本属性,而不仅仅是从会话缓存中。

提前感谢您的回答!

-- LES

0 投票
2 回答
11293 浏览

php - 我可以在 CakePHP 的更新语句中添加条件吗?

由于在 CakePHP 中似乎不支持乐观锁定,因此我正在尝试构建一个实现它的行为。在对行为进行了一些研究之后,我想我可以在 beforeSave 事件中运行一个查询来检查版本字段是否没有改变。

但是,我宁愿通过将更新语句的 WHERE 子句从

这样我就不必担心其他请求会在我读取版本和执行更新之间更改数据库记录。这也意味着我可以进行一次数据库调用而不是两次。

我可以看到该DboSource.update()方法支持条件,但从Model.save()不向它传递任何条件。

似乎我有几个选择:

  1. 办理登机手续beforeSave()并接受它不是防弹的事实。
  2. 破解我的本地 CakePHP 副本以检查数组中的conditions键并将其传递给方法。optionsModel.save()DboSource.update()

现在,我倾向于第二种选择,但这意味着我不能与其他用户分享我的行为,除非他们将我的 hack 应用到他们的框架中。

我错过了一个更简单的选择吗?

0 投票
6 回答
6545 浏览

java - 分布式事务和/或集群中共享数据的 Java 解决方案

集群/分发 Java 服务器应用程序的最佳方法是什么?我正在寻找一种允许您通过添加更多应用程序服务器和更多数据库服务器来水平扩展的方法。

  • 您建议使用哪些技术(软件工程技术或特定技术)来解决此类问题?
  • 您使用哪些技术来设计持久层以扩展到许多读取器/写入器 扩展应用程序事务并扩展对共享数据的访问(最好的方法是消除共享数据;您可以应用哪些技术来消除共享数据)。
  • 根据您的事务是读取还是写入繁重,似乎需要不同的方法,但我觉得您是否可以优化“写入”繁重的应用程序,该应用程序对于“读取”也很有效

“最佳”解决方案将允许您为单个节点编写 Java 应用程序,并希望“隐藏”访问/锁定共享数据的大部分细节。

在分布式环境中,最困难的问题总是归结为让多个事务访问共享数据。似乎有两种常见的并发事务方法。

  1. 显式锁(极易出错且在分布式系统中跨多个节点协调缓慢)
  2. 软件事务内存(STM) AKA 乐观并发,如果事务发现共享状态已更改(并且事务可以稍后重试),则在提交期间回滚事务。哪种方法可以更好地扩展,分布式系统中的权衡是什么?

我一直在研究扩展解决方案(以及提供如何扩展示例的一般应用程序),例如:

  1. Terracotta - 通过使用 Java 的并发锁定机制(同步,ReentrantReadWriteLocks)扩展 Java 内存模型以包含分布式共享内存,从而提供“透明”缩放。
  2. Google App Engine Java - 允许您编写 Java(或 python)应用程序,这些应用程序将分布在“云”服务器中,您可以在其中分发处理事务的服务器,并使用 BigTable 存储持久数据(不确定访问共享的事务的方式数据或句柄锁争用能够有效地扩展)
  3. Darkstar MMO 服务器- Darkstar 是 Sun 的开源 MMO(大型多人在线)游戏服务器,它们以线程事务方式扩展事务,允许给定事务仅运行一定数量并提交,如果需要很长时间,它将回滚(有点像软件事务内存)。他们一直在研究支持多节点服务器设置以进行扩展。
  4. Hibernate 的乐观锁定- 如果您使用 Hibernate,您可以使用他们的乐观并发支持来支持软件事务内存类型行为
  5. Apache CouchDB应该自然地“扩展”到网格配置中的许多读写器数据库。(有没有一个很好的例子来说明如何管理锁定数据或确保事务隔离?):
  6. JCache - 通过将结果缓存到您可以在 Google appengine 中使用来访问 memcached 并缓存其他经常读取的数据的常见查询,来扩展“读取”繁重的应用程序。

Terracotta 似乎是最完整的解决方案,因为您可以“轻松”修改现有服务器应用程序以支持缩放(在定义 @Root 对象和 @AutoLockRead/Write 方法之后)。问题是要真正从分布式应用程序中获得最大的性能,分布式系统的优化并不是事后才想到的,你必须在设计它时知道对象访问可能会被网络 I/O 阻塞。

为了正确扩展,它似乎总是归结为分区数据和负载平衡事务,以便给定的“执行单元”(cpu 核心 -> 线程 -> 分布式应用程序节点 -> 数据库主节点)

似乎要通过集群使任何应用程序正确扩展,您需要能够根据数据访问读取/写入对事务进行分区。人们提出了哪些解决方案来分发他们的应用程序数据(Oracle、Google BigTable、MySQL、数据仓库),以及通常如何管理分区数据(许多写入主机,具有更多读取数据库等)。

在扩展您的数据持久层方面,哪种类型的配置在将您的数据分区到许多读者/许多作者方面表现最好(通常我会根据给定用户(或通常是您的任何核心实体)对我的数据进行分区“根”对象实体)由单个主数据库拥有)