问题标签 [pessimistic-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.
node.js - Node/Postgres 中的乐观和悲观锁定?
我计划在我的下一个项目中使用 Node,因为它似乎非常适合我正在解决的问题。
我需要弄清楚的一件事是乐观和悲观锁定。http://guides.rubyonrails.org/active_record_querying.html#locking-records-for-update
假设用户余额为 1,两个 Node 实例并发请求提现 1,两个请求可以同时通过余额充足的检查,从而成功提现两次,余额为 -1。
Rails 提供了一个围绕 Postgres 事务和锁定特性的包装器。Node 是否存在某种类似的包装器?
你如何在 Node/Postgresql 中解决这个问题?
我知道这是一个数据库功能,但我想知道 Node 或某些库是否提供了一种抽象,而不是编写原始 SQL 查询?
hibernate - 悲观锁定:锁定数据库实体 grails
我遵循 grails 文档,它说要进行悲观锁定,我可以这样做:
所以这会锁定计划实例,直到完成保存为止。现在,在我的情况下,我想一次锁定多个计划,如下所示:
我在默认情况下是事务性的 grails 服务中执行此操作,但上面的行没有按预期工作stale state exception
。如果执行并发事务,它不会锁定所有行并抛出。
阅读时如何锁定多行?
有关更多信息,请参阅相关问题:grails 中的并发事务导致数据库陈旧状态异常
jsf - JSF/JPA/EJB 从“编辑”页面锁定实体的最佳实践
我们有一个基本的 JSF/EJB/JPA Web 应用程序,其中 EJB 业务 bean 与 JPA/实体管理器一起工作并管理所有事务。
那是:
Page.xhtml => PageBean.java => BusinessBean.java => Entity.java
Page.xhtml 显示实体值的位置。PageBean 通过方法调用(例如 BusinessBean.getEntityById(x))从业务层检索实体。业务 bean 像这样检索实体:
然后在表示层中编辑实体,并在提交表单时从业务 bean 上的支持页面 bean 调用业务方法:
我不确定这是否是最好的方法,欢迎对此方法发表评论。
然而,核心问题与管理锁定有关。要求是当用户进入实体的“编辑”页面时,实体将被锁定,并且不允许其他用户通过任何其他方法对其进行编辑(例如,自己进入该实体的编辑页面)。
如果用户消失,我们如何构建我们的页面支持 bean 和业务逻辑以允许这种情况发生并防止半/永久锁定?由于事务在业务层开始和结束,我不确定我们如何锁定它并在用户在表示层进行交互时保持该锁定。
java - 带有准备好的语句休眠的悲观锁定
我有一个汇总成功计数的批处理系统。许多服务器进行聚合,所有服务器同时更新表中的单行。我像这样使用休眠执行准备好的语句
几乎没有并发问题并决定使用悲观锁定,因为冲突的可能性非常高。在休眠中使用这样的准备好的语句时,如何执行悲观锁定。
ruby-on-rails-3 - Rails 3:如何在控制台上简单地测试悲观锁定
我目前正在用 rails 3 + postgresql 做一个悲观的 loking。但似乎没有办法确认锁正在工作,除非我经历了进行并发测试的麻烦。有没有办法通过控制台测试这个?
例子
mongodb - 排他锁
我想用 mongo 或 couch db 获取独占锁。
- 可能吗?(API 参考会有所帮助)
- 当客户端突然死亡时,是否有可能释放独占锁?
database - 锁定机制(悲观/乐观)如何与数据库事务隔离级别相关?
我正在编写一个 Web 应用程序,其中两个不同的用户可以更新一个事情列表,例如待办事项列表。我已经意识到,乐观锁定机制效果最好,因为我不期望高争用。
我正在查看事务隔离级别,现在我有点困惑。看起来不同的事务隔离级别也解决了类似的问题。
这两个不同的概念如何相互关联?如果可能的话,举一个简单的例子。
java - Infinispan 缓存在悲观模式下不会抛出异常
我正在运行基于Infinispan单元测试之一的简单测试用例。在我的测试中,我希望CacheException
在集群中的复制超时时收到。
我使用悲观事务锁定,并且在这种情况下由于某种原因不会引发异常。如果我评论悲观锁定,我会按预期得到异常。
有人可以帮我理解为什么它在启用悲观锁定的情况下隐藏异常以及如何解决这个问题?
更新:我正在使用 Infinispan 5.3.0.Final。
database - 悲观与乐观并发控制
我有一个关于悲观与乐观锁定的问题。每个人都说“当你不期望有很多冲突时使用乐观锁定。”,例如:
对于一个学校项目,当悲观锁定比乐观锁定更合适时,我需要找到“收支平衡”点。
现在,我想知道/理解为什么存在这样的盈亏平衡点?悲观锁定怎么可能比乐观锁定更昂贵(在速度或内存使用方面?)?
我怀疑这是因为悲观锁定需要额外的读取操作。但是对于乐观锁定,这个额外的读取操作也是需要的(仅在保存操作之前),对吧?
希望有人能解释一下:)谢谢!
java - 混合乐观/悲观锁
应用程序
你好,
我们有一个应用程序(J2EE/Hibernate/JPA),其中有几个用户在一个公共实体上执行操作。
为简化起见,假设此应用程序类似于Google 文档:许多用户可以同时对其进行更新的共享文档。
我们选择了光学锁来处理并发:
- 句子是独立的实体
- 多个用户同时更新同一个句子的可能性很小
- 在这种情况下,一个用户可以收到一条消息“对不起,另一个用户试图编辑同一个句子”
后台进程
到目前为止,一切都很好。
但是现在,我们已经为这个应用程序添加了后台进程(相当快的)。他们定期进行更改(假设它用另一个单词替换任何出现的单词)。
那些工作失败也没关系。他们的任务不紧急,下次(10 秒后)可以尝试相同的任务。
在这种情况下,乐观锁的问题在于,现在单个用户无法对整个文档执行更长的操作。
实际上,如果用户更改了整个文档的字体(在所有句子上),并且此操作需要一段时间(> 10 秒),那么在此期间后台进程将更改一些单词,并且更长的操作(=用户操作:更改字体)将在并发访问时失败。
向用户显示此消息是不可接受的:“您的操作失败,因为一些技术过程同时运行”。
而且由于后台进程可以稍后重试,我们宁愿让它失败。
问题
我们如何在乐观锁定方法中为某些动作/参与者设置悲观锁定?
潜在的解决方案
为了保持对用户的乐观态度,我们想到了以下解决方案:
- 创建一个“用户操作”标志,该标志将在任何用户的任何操作期间设置
- 在此标志为“关闭”之前,作业不会开始
- 在任何正在运行的进程结束时,检查标志是否打开:如果是,取消此操作/回滚。
这样,进程将只能在空闲时间运行,而用户不做任何事情。
帮助
这是一个好方法吗?我们找不到任何关于混合类型锁的良好实践的文章/讨论。