由于悲观锁只能应用于单个数据库事务。并且在用户思考时间内保持数据库事务打开,数据库中持有的锁被认为是反模式,那么在用户思考时间之间实现悲观锁的正确方法是什么?
我知道如何在与用户思考时间之间的长时间对话中实现乐观锁定,只是不知道如何在与用户思考时间之间的长时间对话中实现悲观锁定。
简短的回答是,没有“简单的配方”来做到这一点,也没有来自Hibernate或任何其他ORM框架的任何现成的解决方案。
长长的答案:
您必须了解如何实现一些特性,这些特性将允许您的应用程序模拟“长对话”的数据库锁定行为。
最重要的是,确保一旦用户开始使用一条信息(数据库行或一组对象,无论您的情况如何),该信息将不会被任何其他用户使用/操纵。此外,您还必须确保在用户完成操作时,或在一定时间后(您不希望信息被永久锁定),您有一些发布信息的策略。
由于我不知道你的应用程序的细节,我将给出一个抽象的例子,这可能会对你的案例有所启发。当然,这不是唯一的解决方案。
请记住,每一步都将包含在单个事务中,因为最终,您的长对话将是Web应用程序中的一系列请求。
此外,假设来自问题标签的信息,这个答案的目标是在一个连接到数据库的简单Web应用程序中找到一个解决方案。没有“花哨的异国情调”架构。
在需要这种控制的给定表中,添加两列:一列是用户ID,另一列是时间戳。这将控制谁拥有一行上的“锁”,以及获得锁的时间。
当用户开始使用表的行中包含的数据时,您的应用程序将使用用户ID和当前日期/时间更新该行。这是最重要的一步,因为您必须正确处理并发问题。如果不止一个用户试图获取该行的“锁”,则您的应用程序必须仅为一个用户让出锁。此步骤很可能需要在单个事务中使用数据库锁。请确保此步骤快速,并且不会附加到其他操作,这样数据库锁不会对应用程序产生很大影响。
用户操作完数据后,应用程序可以简单地将用户ID和时间戳设置为空,之后其他用户将能够使用它。
如果用户由于某种原因没有完成任务,您将不得不应用某种“释放”策略。在简单的情况下,简单的时间到期将解决此问题。如果给定用户尝试在已经有锁的行上获取“锁”,您的应用程序将检查时间戳。如果时间戳过期,新用户将覆盖锁。如果没有,该行不可用。
还有其他更复杂的场景。如果在您的过程中,在操作完全完成之前,数据库中的信息发生了变化(假设用户进行了各种信息更改,并在用户完成操作并“释放”行之前将它们发送到数据库),那么您可能必须弄清楚如何实现回滚。也许让数据“半操作”是可以的,也许不是,这取决于您的业务需求。
长话短说:
> < li >锁由数据库表中的列组成 < li>
您的代码控制锁
用户尝试获取锁
仔细考虑这些建议是否适用于您的场景。
我希望这有帮助。
编辑:在这种情况下,因为我使用了“版本”注释,所以我使用了乐观锁定,而不是悲观锁定。< br >如果我删除版本并因此禁用乐观锁定。悲观锁定会接管,性能会显著下降。< br >所以我想我必须忍受乐观锁定和偶尔的异常。有没有更好的解决办法? 原文:我目前通过ajp在apache 2.2负载均衡器中有多个Tomcat实例。后端系统处于Hibernate状态。该系统为多个用户和请求提供服务,对于请求,它会
我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。
我有以下类层次结构: 我正在尝试读取并锁定一个具体实例,以便其他事务无法读取它,使用hibernate。 现在的函数: 正在工作-为刷新操作生成“SELECT for UPDATE”语法。 refresh()和get()函数之间的不同之处在于get()函数使用外部左联接来选择具体对象,而refresh()使用内部联接来选择具体对象。 在悲观锁定的上下文中,这些连接之间有区别吗?
我读到我们可以使用<code>@version</code>在hibernate中使用version字段实现乐观锁定。然后,通过阅读悲观锁定,我知道了<code>org.hidbernate。LockMode</code>类,它有一些选项,如<code>LockMod。我们可以在中指定的OPTIMISTICetc。 所以我的问题是我是否需要同时使用和?
问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c
这是令人难以置信的沮丧…我正在使用Couchbase v3 C API,我遇到了一个问题,这个问题可以通过使用他们的“悲观”锁定来完美解决。经过一番努力,我相信我终于找到了如何使用它锁定记录(使用,它大概需要一个以微秒为单位的参数),但是我不知道如何在完成后解锁记录,除了让它超时,这不是一个可以接受的解决方案。 这里的文档提供了一个示例,但出于某种未知的原因,它使用的是Javascript而不是C