【问题标题】:OpenEdge Database Row VersionOpenEdge 数据库行版本
【发布时间】:2023-04-04 08:45:01
【问题描述】:

我正在尝试为我们的 OpenEdge 数据库中的表实施行版本策略。

我想出的简单解决方案是向每个表添加一个整数 iRowVersion 字段,并让写入触发器验证并递增该字段,如下所示:

TRIGGER PROCEDURE FOR WRITE OF Customer OLD BUFFER oldCustomer.

IF Customer.iRowVersion < oldCustomer.iRowVersion THEN
  RETURN ERROR "RowVersion Out Of Date".

ASSIGN Customer.iRowVersion = Customer.iRowVersion + 1.

这将防止任何并发更改被覆盖,但是我不确定每行增加一个是最好的。 SQL ROWVERSION 在整个数据库中递增,为了模拟该方法将使用序列来代替:

ASSIGN Customer.iRowVersion = NEXT-VALUE(rowVersionSequence).

在我们的大型数据库中,许多记录都将发生变化,这有可能非常迅速地增加序列。每张桌子有一个序列会减少这种情况,但似乎过头了,+1 的方法让它变得简单。

为了澄清这个问题 - 最好根据上一个版本的行增加行版本号,还是应该采用类似 SQL 的方法 - 使每个行版本对数据库都是唯一的。

另外,如果采用 SQL 风格路线,创建触发器是否需要分配初始行版本? (否则所有新的未修改记录都初始化为 0)。

【问题讨论】:

  • 为此使用序列并没有错 - 如果您将 INT64 用于版本字段,那么您也可能会溢出该字段。
  • 这里有问题吗?
  • 更新@TomBascom
  • 您正在实施的称为乐观锁定 - ProDataSets 可以很好地做到这一点,而无需求助于触发器和版本字段。
  • 我在这里看到:documentation.progress.com/output/ua/OpenEdge_latest/… 但是我看不到与通过无状态 AppServer 连接的 3rd 方客户端一起工作。如果两个客户端连接并想要应用他们的更改,它们都将被视为已更改,一个会覆盖另一个不?

标签: openedge progress-4gl progress-db rowversion


【解决方案1】:

对于 OpenEdge 数据库中的版本控制记录,我现在有一个应该可以很好地工作并且相当简单的解决方案。

需要有行版本的每个表都将有一个 Integer 类型的 RowVersion 字段。

我们有一个程序可以在创建新表时生成写入触发器,因此更新它以添加一些新代码非常简单。写触发器现在检查记录以查看表是否有 RowVersion 字段,如果有,则将版本增加 1。 在更新之前检查以确保行版本匹配是程序员在他们正在运行的代码/脚本中的责任。

这种方法有几个原因,但它使事情变得简单:

  1. 在运行查询和调试数据库时,整数简单易读。鉴于我们的应用程序使用情况,我们也不太可能溢出整数。

  2. 不需要序列来保持行版本的唯一性。他们不需要。每条记录只是增加自己的行版本。

  3. 虽然 ProDataSets 可以做乐观锁,但不能保证使用中的记录总是会被这些读/写,因此一个字段让我们可以根据用途灵活地编写不同的代码。

  4. 通常应在更新前检查行版本,如果存在数据问题,则可能需要运行修复脚本以覆盖数据。为此,我们将检查留待在调用过程(而不是触发器)中完成,以便对记录进行写操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 2019-11-03
    • 2017-02-04
    • 2021-11-20
    相关资源
    最近更新 更多