SQL Server:Oracle 中的 RowVersion 等效项

2024-02-18

Oracle 有类似的数据类型吗SQL服务器RowVersion http://technet.microsoft.com/en-us/library/ms182776.aspx?

当您插入或更新一行时,相应的版本列(其类型为RowVersion) 自动更新。

MSDN 关于 RowVersion 的说明 http://technet.microsoft.com/en-us/library/ms182776.aspx:

  • 是一种公开自动生成的唯一二进制数据类型 数据库中的数字。 rowversion 一般用作一种机制 对于版本标记表行。存储大小为8字节。这 rowversion 数据类型只是一个递增的数字,并不 保留日期或时间。

  • 每个数据库都有一个计数器,每次插入或插入时该计数器都会递增 对包含以下内容的表执行更新操作 数据库中的 rowversion 列。这个计数器就是数据库 行版本。这跟踪数据库内的相对时间,而不是 可以与时钟关联的实际时间。一张表只能有 一行版本列。每次有一个 rowversion 列的行 修改或插入时,增加的数据库 rowversion 值为 插入 rowversion 列。

  • 您可以使用行的 rowversion 列轻松确定是否 自上次读取以来,该行中的任何值都已更改。如果 对行进行任何更改,rowversion 值都会更新。如果不 对行进行更改时,rowversion 值与更改时相同 之前已读过。

  • 您可以向表中添加 rowversion 列以帮助维护 当多个用户更新行时数据库的完整性 同时。您可能还想知道有多少行以及哪些行 更新后无需重新查询表。

我们正在使用oracle设计一个数据模型,并希望使用Version列来管理并发性。

我也想知道Oracle世界里有没有更好的方法。


Oracle 有 SCN(系统更改编号):http://docs.oracle.com/cd/E11882_01/server.112/e10713/transact.htm#CNCPT039 http://docs.oracle.com/cd/E11882_01/server.112/e10713/transact.htm#CNCPT039

系统更改号 (SCN) 是 Oracle 数据库使用的逻辑内部时间戳。 SCN 对数据库内发生的事件进行排序,这是满足事务的 ACID 属性所必需的。 Oracle 数据库使用 SCN 来标记在该 SCN 之前所有更改都位于磁盘上的 SCN,以便恢复时避免应用不必要的重做。数据库还使用 SCN 来标记一组数据不存在重做的点,以便停止恢复。

SCN 以单调递增的顺序出现。 Oracle 数据库可以像时钟一样使用 SCN,因为观察到的 SCN 指示逻辑时间点,并且重复观察会返回相等或更大的值。如果一个事件的 SCN 低于另一事件,则该事件相对于数据库发生的时间更早。多个事件可能共享相同的 SCN,这意味着它们相对于数据库同时发生。

每笔交易都有一个SCN。例如,如果事务更新一行,则数据库会记录发生此更新的 SCN。此事务中的其他修改具有相同的 SCN。当事务提交时,数据库会记录本次提交的 SCN。


使用 ORA_ROWSCN 伪列检查行的当前 SCN:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns007.htm#SQLRF51145 http://docs.oracle.com/cd/B28359_01/server.111/b28286/pseudocolumns007.htm#SQLRF51145

一个例子:

SELECT ora_rowscn, t.* From test t;

演示 -->http://www.sqlfiddle.com/#!4/535bc/1 http://www.sqlfiddle.com/#!4/535bc/1
(在 SQLFiddle 上,显式提交显然不起作用 - 在真实数据库上,每次提交都会增加 SCN)。


“真实”数据库的示例:

CREATE TABLE test(
  id int,
  value int
);

INSERT INTO test VALUES(1,0);
COMMIT;
SELECT ora_rowscn, t.* FROM test t;

ORA_ROWSCN         ID      VALUE
---------- ---------- ----------
   3160728          1          0

UPDATE test SET value = value + 1 WHERE id = 1;
COMMIT;
SELECT ora_rowscn, t.* FROM test t;

ORA_ROWSCN         ID      VALUE
---------- ---------- ----------
   3161657          1          1

UPDATE test SET value = value + 1 WHERE id = 1;
COMMIT;
SELECT ora_rowscn, t.* FROM test t;

ORA_ROWSCN         ID      VALUE
---------- ---------- ----------
   3161695          1          2 

如果事务的 SCN 已知,我们可以使用闪回查询来获取该行的过去值:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm#g1026131 http://docs.oracle.com/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm#g1026131

一个例子:

SELECT t.*,
       versions_startscn, versions_starttime,
       versions_endscn, versions_endtime,
       versions_xid, versions_operation
FROM test VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE t;

        ID      VALUE VERSIONS_STARTSCN VERSIONS_STARTTIME  VERSIONS_ENDSCN VERSIONS_ENDTIME    VERSIONS_XID     VERSIONS_OPERATION
---------- ---------- ----------------- ------------------- --------------- ------------------- ---------------- ------------------
         1          2           3161695 13/12/10 08:19:39                                       06000300EA070000 U                  
         1          1           3161657 13/12/10 08:18:39           3161695 13/12/10 08:19:39   06001200EA070000 U                  
         1          0                                               3161657 13/12/10 08:18:39                         


SELECT t.*,
       versions_startscn, versions_starttime,
       versions_endscn, versions_endtime,
       versions_xid, versions_operation
FROM test VERSIONS BETWEEN SCN 3161657 AND 3161657 t;

        ID      VALUE VERSIONS_STARTSCN VERSIONS_STARTTIME  VERSIONS_ENDSCN VERSIONS_ENDTIME    VERSIONS_XID     VERSIONS_OPERATION
---------- ---------- ----------------- ------------------- --------------- ------------------- ---------------- ------------------
         1          1           3161657 13/12/10 08:18:39                                       06001200EA070000 U                               
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server:Oracle 中的 RowVersion 等效项 的相关文章

随机推荐

  • Apache Spark 中失败的任务是否会重新提交?

    Apache Spark 中失败的任务是否会自动重新提交给同一个或另一个执行器 是的 但是有一个最大失败次数的参数设置 spark task maxFailures 4 Number of individual task failures
  • 将模型传递给局部视图?

    这是我的部分 model RazorSharpBlog Models MarkdownTextAreaModel div class wmd panel div div Html TextAreaFor m gt m Name new id
  • emacs 23 python.el 自动缩进样式——可以配置吗?

    我使用 emacs 23 python el 已经一个多月了 我对默认的自动缩进设置不满意 目前 我的 Python 文件自动缩进如下 x a function with dict parameter test Here is a valu
  • 带有时间戳和日期字段的 JPA 选择查询无法检索结果

    我正在尝试使用 JPA 查询获取记录 该查询在 WHERE 子句中具有 DATE 和 TIMESTAMP 列 但不知何故 日期和时间戳列无法从数据库中检索任何内容 代码段 String sql Select F from FIN TABLE
  • json_encode 将带有 Unicode(版权)字符的字符串编码为 null?

    我在对特殊字符进行 JSON 编码时遇到问题 这些字符在我的计算机 记事本 浏览器甚至我的数据库中正常显示 但是 它们不进行 JSON 编码 示例如下 site com 之后的版权符号使 JSON 字符串回显为 copyright str
  • 所有实体的 Spring Data Redis 全局 TTL

    我需要为我拥有的每个实体设置全局 TTL 并且它应该可以在一个地方进行配置 有机会通过 RedisHash 注释来做到这一点 RedisHash value persons timeToLive 100 public class Perso
  • 在全屏 JavaFX 中更改场景

    我是 JavaFX 新手 我有我的主要场景和次要场景 当我从第一个场景更改为第二个场景时 窗口的栏变得可见 我该如何解决这个问题 这是我的代码 public class ProyectoTeoriaBD1 extends Applicati
  • 如何使用反斜杠 x \x 代码解码 ascii 字符串

    我正在尝试从巴西葡萄牙语文本中解码 德迈斯子fun xc3 xa7 xc3 xb5es 12 它应该是 德迈斯子函数 12 gt gt a decode unicode escape gt gt a encode unicode escap
  • 使用 DeviceIoControl 函数读取 MBR 时出现问题

    我在调用 DeviceIoControl 函数读取可移动设备的 MBR 时遇到错误 错误代码是5 这意味着访问被拒绝 我使用的是Windows XP SP2 include stdafx h include
  • 在 SwiftUI 中动态获取视图的 Shape

    使用 Swift 5 2 我想创建一个函数来动态更改Shape 我有一个像 import SwiftUI struct CardView View let suit Suite let rank Rank var body some Vie
  • 如何在 AWS Powershell 脚本中使用 KMS 密钥加密数据

    我正在尝试使用 AWS KMS 加密文本并创建 powershell 脚本 所以我用了New KMSDataKey加密我的 KMS 主密钥 该密钥在输出中返回plaintextDataKey and ciphertextblob 现在我正在
  • 在 Assembly 中实现流程“(1) if {...} else if {...} ... (2)”

    我在 C 中有以下流程 some stuff1 if something1 func1 func2 else if something2 func3 func4 some stuff2 我想知道如何在汇编中对其进行编码 我的意思是 不是精确
  • Windows 控制台%DATE% 数学

    我想将 Windows 批处理文件中的日期设置为从今天起 7 天前 我想按照以下格式执行此操作 set today date 10 4 date 4 2 date 7 2 有什么想法如何减去这里的 7 天时间增量吗 我前段时间在某个网站上发
  • php fputcsv 在 CSV 中使用分号分隔符

    我编写了一段代码 从数据库检索数据并使用函数 fputcsv 将它们填充到 CSV 中 我把以下内容放在上面 file fopen internal customer info csv w 然后我检索数据并将它们放入变量中 运行该函数 cu
  • 意外的 NSAutoresizingMaskLayoutConstraint 将 UIView 从笔尖添加到自动布局故事板场景

    我在 IB 中有以下内容 并且两个视图都打开了 使用自动布局 并关闭了 调整子视图大小 我只是尝试将自动布局视图的实例添加到容器视图中 以便其边缘与其容器视图的边缘相交 容器视图启用了 使用自动布局 并且高度相同 但宽度是其两倍 这是代码
  • Flutter - 在 CustomPainter 上获取触摸输入

    我有一个简单的 CustomPaint CustomPainter 来绘制一段圆 代码如下 我读到我无法使用 GestureDetector 因为它不是一个合适的小部件 那么获取输入的最佳方式是什么 我将把一堆片段放在一起 所以我需要像素精
  • 页面上的 WPF KeyDown 事件

    我有一个NavigationWindow with Page 页面 XAML
  • 如何制作符号表

    我们的任务是制作一个编译器 我们已经进行了词法和语法分析 但我们仍停留在中间代码的生成上 我们意识到我们必须实现一个符号表才能进行中间代码生成 但我们不知道如何做到这一点以及它包含什么 给出下面的代码 符号表应该包含什么 该代码是用教育语言
  • 选择器 - 在 jQuery 中选择页面上的所有表格

    假设我在嵌入式 div 的各个级别的页面上有多个表 没有 ID 或名称 我的选择器会是什么 如果可能的话 来选择所有表 无论它位于页面上的哪个位置 并根据第一行中第一个单元格的内容迭代或过滤表 你可以简单地使用 table 作为你的选择器
  • SQL Server:Oracle 中的 RowVersion 等效项

    Oracle 有类似的数据类型吗SQL服务器RowVersion http technet microsoft com en us library ms182776 aspx 当您插入或更新一行时 相应的版本列 其类型为RowVersion