【问题标题】:lost update issue丢失更新问题
【发布时间】:2009-10-26 13:23:27
【问题描述】:

我的服务器上有一个 weblogic 集群 ejb2 应用程序。数据库中有这张表,其他用户将同时创建、更新和删除。

在我的客户端机器上是一个富客户端 Java 应用程序。我如何发送更改的增量更新,但仍保持一致且始终正确的表视图? (因此不会丢失更新,如果可以检测到丢失更新,则需要恢复机制来重新同步视图)

想到了Subversion全局修订号的想法,但不知道如何实现,因为应用程序是在集群上的。

有什么想法吗?

您的应用程序包含哪些类型的 EJB?
无状态会话 bean

其他用户如何访问此表?
通过带有 jdbc 连接的无状态会话 bean 到 JSP 的 apache httpclient

更新在哪里丢失?
每个客户端将在启动时执行整个表的拉取。增量信息的后续更新将被推送到富客户端。丢失的更新发生在客户端 A 试图提取信息并且客户端 B 编辑表时。由于客户端 B 的编辑包含将被推送到客户端 A 的增量信息,因此它可能会更快到达。客户端 A 没有收到完整的表,因此丢弃了增量信息。

【问题讨论】:

  • 您的应用程序包含哪些类型的 EJB?实体 Bean?其他用户如何访问此表?您的富客户端应用程序是做什么的?该更新在哪里丢失?我实际上没有得到整个问题,我想知道您是否指的是乐观并发检查的“版本号”模式。你能详细说明一下吗?
  • 听起来确实像版本号模式...

标签: weblogic global


【解决方案1】:

我仍然不确定,但您可能希望使用optimistic locking 来实现concurrency control(有关其他策略,请参阅整篇文章)。乐观锁很容易实现。一种选择是:

使用唯一标识符标记源。每次更新源数据行时都会用唯一值进行标记。在更新点检查标记,如果有与您最初读入的值不同的值,那么您就知道源已经更新了。

使用增量计数器是可能的并发标记之一。这个想法是为您的实体添加一个版本号,并在每次保存时增加它。

图片您读取了一条 VERSION_NUM = n 的记录。如果以下更新请求失败:

UPDATE T 
SET VERSION_NUM = VERSION_NUM + 1 [,column_name = value ...] 
WHERE VERSION_NUM = n [AND ...]

那么在您编辑记录时,有人已经更新了记录。

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多