OpenEdge 数据库行版本

OpenEdge Database Row Version

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

我想出的简单解决方案是向每个 table 添加一个整数 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).

在我们的大型数据库中,许多记录都会发生变化,这有可能很快增加序列。每个 table 有一个序列会减少这个,但似乎在顶部,+1 方法保持简单。

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

此外,如果沿着 SQL 样式路线走,创建触发器是否需要分配初始行版本? (否则所有新的未修改记录初始化为 0)。

对于 OpenEdge 数据库中的版本控制记录,我现在有一个解决方案应该运行良好,而且相当简单。

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

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

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

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

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

  3. 虽然ProDataSets可以做乐观锁,但是并不能保证使用中的记录总是会被读/写,因此一个字段给了我们写不同代码的灵活性,这取决于采用。

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