DB2 Optimistic Concurrency - RID,行版本,时间戳澄清

时间:2013-12-19 21:35:53

标签: sql concurrency db2

我目前正在阅读在DB2中实现乐观并发检查。我一直主要阅读http://www.ibm.com/developerworks/data/library/techarticle/dm-0801schuetz/http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.dbobj.doc%2Fdoc%2Fc0051496.html(以及其他一些IBM文档)。

当您拥有ID列时是否需要RID?在2个链接中,他们总是提到使用RID和行更改版本,但是RID是行ID,所以我不清楚为什么我需要在行更改令牌看起来像SQLServer的rowversion时使用它(除了页面而不是行)

只要我有一个row-change-timestamp列,那么我的行更改令牌粒度就足以防止大多数误报。

感谢。

2 个答案:

答案 0 :(得分:0)

您是否知道如果在同一SQL语句执行中更新多行,它们将获得相同的时间戳(如果在该语句中更新了时间戳)?

这意味着时间戳列可能是唯一行标识符的错误选择。

答案 1 :(得分:0)

我阅读第一篇文章的方式是您可以使用任何这些功能,您不需要使用所有这些功能。特别是,行更改时间戳似乎来自RID()ROW CHANGE TOKEN

  

基于时间的更新检测:
  使用此功能将此功能添加到SQL   RID_BIT()和ROW CHANGE TOKEN。要支持此功能,请使用表格   需要定义一个新生成的列来存储时间戳   值。可以使用ALTER TABLE将其添加到现有表中   语句,或在创建新表时可以定义列。该   列的存在,也会影响乐观锁定的行为   该列是否用于改善ROW的粒度   从页面级别到行级别更改令牌,这可能会大大受益   乐观锁定应用程序。

...除其他外,与ROW CHANGE TOKEN相比,时间戳实际上增加了粒度,因此更容易处理更新。

由于多种原因,请确保将db时间设置为UTC,因为DB2不跟踪时区(因此,如果您使用的是DST,则相同的时间戳可能会发生两次)。

(作为旁注,RID()在所有平台上都不稳定。至少在iSeries版本上,如果有人重新调整表格,它会发生变化,并且您可能无法获得预期的结果当它与连接一起使用时。我也不确定是否使用镜像......)