DB2提供一种更好的方法实现乐观锁定

在 IBM i 6.1 版本,DB2 为用户提供一项新功能(ROW CHANGE列)可以为需要使用乐观锁的应用程序改进其算法。乐观锁定是一种基于网络数据库应用程序中广泛应用的技术,这些应用程序一定会读取数据但是只是有可能更新读取过的数据,但其不会维持一个与数据库的持久连接。因为应用并不维持一个持久的连接,用户不能够依靠行级锁为那些后续更新的行保持数据完整性。实现乐观锁定的一个常见方法是,把这个应用程序可能稍后要更新的那一行对应的列的所有值记录在缓存中,再将这些值在接下来的更新语句作为条件。

SELECT * FROM SCHEMA.TEST
C1 C2 C3 ...
10 12 33 ...
...UPDATE SCHEMA.TEST SET C1 = 12 WHERE C1=10 AND C2=12 AND C3=33 ...

如果另一个用户已经对当前行做了更新操作,这条更新语句将会失败,因为选择条件无法匹配被更新过新行的值。因此,DB2 不会覆盖任何之前的改变。运用乐观锁定,许多应用程序的用户能够并行的从数据库访问数据,同时允许一个单独的更新语句发生,而不用担心数据的丢失或者其它并发用户覆盖已更新过的数据。

存储一行的每一个属性对用户来说十分不便,但应用程序需要一种方式保证当其它用户对数据做出改变的时候,当前用户不会改变行中任何一列的值。幸运的是,从 DB2 for i 6.1 版本开始,有一种更简单的方法来确定从应用程序读取记录到当前为止数据库记录是否发生了改变。

这就是 DB2 for i 的新特性乐观锁定真正突出的地方。用户可以使用新的 PREPARE 属性设置或者客户端应用编程接口设置来使用这项支持。运用这种新的技术,DB2 将在返回的结果集中自动增加两列,这两列用于唯一地标识当前行和上次更新的时间。

应用程序无需为这更新时间列赋值;这一行每次更新后,这一特定列的值也会自动更新。

列 ROW CHANGE 支持

从版本6.1起,应用程序能够请求在任一查询的结果集中返回 ROW CHANGE 列。ROW CHANGE 列由两个独立的二进制列组成,分别是行变化特征(RCT)和行 ID(RID)。应用程序可以决定是否通过这两列来保证唯一性,或者在大多数情况下足够保证唯一性(将会在下面分别进行解释)。这些列可以是被应用程序显式地加到选择语句的列表里,也可以更方便地通过传入一个准备语句的属性完成添加:

STMT = ‘SELECT * FROM SCHEMA.TEST’;
ATT = ‘WITH ROW CHANGE COLUMNS ALWAYS DISTINCT’;
EXEC SQL DECLARE C1 CURSOR FOR S1;
EXEC SQL PREPARE S1 ATTRIBUTES :ATT FROM :STMT
EXEC SQL OPEN C1;

某些应用编程接口,比如 JAVA Database Connectivity(JDBC)和 iAccess .NET provider,也提供一些语句属性能够要求 DB2 在准备语句中添加这些列,从而查询语句本身不必改变。

行ID和行改变特征

RID 是一个 DB2 for i 为每一行自动添加的 BIGINT 类型的值。RID 标识行在表中的位置。

RCT 是一个派生出来的值。如果应用程序要求 RCT 和 RID 生成的值必须保证唯一性,那么表必须有一列是时间戳类型,而且拥有 FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP 属性:

ALTER TABLE TEST ADD COLUMN

RTS TIMESTAMP NOT NULL

GENERATED ALWAYS

FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP

IMPLICITLY HIDDEN

当一个表包含这一特殊的时间戳类型的列,每一行返回的 RCT 的值来源于这一特殊列中存储的值。应用程序无需为此列赋值;每次行更新时,RCT 这一列的值随之自动更新。像其它的列一样,在 6.1 及之后的版本中这一列能够被定义成隐藏列,这就表示当对这个表做 SELECT * 查询的时候,这一列不会被返回。

请注意,即使有这一附加列,RCT 自身存储的值并不能保证唯一性,这是因为在某些情况下可能有多行返回相同的时间戳。然而,RCT 和 RID 两列在一起可以保证唯一性。

有些应用程序则并不绝对要求返回的 ROW CHANGE 列值的唯一性,因此不必为表增加一个 ROW CHANGE 时间戳类型的列,RCT 将会在 DB2 内部生成。

决定一个表是否应该增加特殊时间戳类型的列,一个需要考虑的因素就是周期性更新操作的数量。对于一个拥有繁重更新活动的表,增加一个ROW CHANGE 时间戳类型的列可能是值得的,可以减少应用程序必须处理的漏报(这里指一个行的更新操作结束而并没有被更新的情况)。另一方面,如果更新操作很少发生,你能够节省磁盘空间,取代依靠由内部算法生成的 RCT。

当使用 DB2 准备属性,从游标中取出数据时,RID 和 RCT 分别以列 QRID 和 QTOKEN 的名字自动地添加到每一行的末尾:

STMT = ‘SELECT * FROM SCHEMA.TABLE’;

ATT = ‘WITH ROW CHANGE COLUMNS ALWAYS DISTINCT’;

EXEC SQL DECLARE C1 CURSOR FOR S1;
EXEC SQL PREPARE S1 ATTRIBUTES :ATT FROM :STMT
EXEC SQL OPEN C1;EXEC SQL FETCH C INTO ...

C1 C2 C3 ... Q TOKEN Q RID

10 12 33 ... #### $$$$

...EXEC SQL UPDATE TEST SET C1 = 12 WHERE ROW CHANGE
TOKEN(SHEMA.TABLE)=#### AND RID(SCHEMA.TABLE)=$$$$

注意:RCT 和 RID 是以 BIGINT 类型返回的。

时间: 2016-12-17

DB2提供一种更好的方法实现乐观锁定的相关文章

提供一种“间接防止另存为”的方法

提供一种"间接防止另存为"的方法特点:笨笨的.烦烦的      因为需要用到3个垃圾文件(不过还好,加起来才10来行不太熟悉的代码)条件:无(客户能保证自己正常浏览就行了)文件:     主页面 main.htm     垃圾文件:x.asp,xx.asp     main.htm///////////////////<HTML><HEAD> <TITLE></TITLE><SCRIPT LANGUAGE=javascript  s

交互设计师:讨论几种处理问题的方法

当一个项目开始时,交互设计师如何开始工作呢?需要使用什么工具和方法来解决问题呢?尽管很多交互设计师坚持以用户为中心(UCD)这一种设计方法,这根本是不正确的. 有几件事,是一个新的交互设计师启动项目时面临的专业问题.项目一般因两个原因而引起:有些事情是不完整的或者根本不存在."用户在抱怨这个产品!"一个企业经理会马上说:"我们必须做点改变."(即使并没能解决问题,但是交互设计师就应该发现问题)或许某人在某地考虑到:"也许那样做或许更好."并且,当

JavaScript中5种调用函数的方法

 这篇文章主要介绍了JavaScript中5种调用函数的方法,本文详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助,需要的朋友可以参考下     这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! JavaScript,调用函数的5种方法 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascript函数是如何工作而导致的(顺便说一下

揭秘7种黑白转换方法 看看哪种更适合你

  根据画面内容和影调的不同,这些手段可能更容易实现,效果和ACR相比也更好.当然,想要得到正确的结果,最重要的还是首先对RAW文件进行适当的优化,调整曝光.反差与亮度,并保存为无损的TIFF格式. 想在Photoshop中将图像转换为黑白的方法很多,除了Adobe Camera Raw之外,我们还比较了其他七种有代表性的方法. 一.转换为灰度 这是最简单的一种方法,直接将图像色彩模式从彩色更改为灰度,效果也能接受.选择图像>模式>灰度,然后在弹出的"扔掉色彩信息"提示对话

看看这五种博客推广方法的具体说明

在互联网的圈子里有关推广的问题是一个永恒的话题,你的商品哪怕再好如果没有推广出去一切都是白搭,经常听有人说"酒香不怕巷子深",但结合当今社会的形式,特别是在竞争日益残酷的今天我想"酒香也会怕巷子深了".如果你的产品未能及时进行推广,被别人抢先占领了市场,那么要想后来者居上难度是可想而知的.很多朋友不知道在互联网上到底该怎么推广,其实关键还是在于多思考转变思维方式,下面我就给大家介绍行之有效的5种博客推广方法: 一.视频优化推广 随着搜索引擎整合搜索的改进,搜索关键词

《用Python写网络爬虫》——2.2 三种网页抓取方法

2.2 三种网页抓取方法 现在我们已经了解了该网页的结构,下面将要介绍三种抓取其中数据的方法.首先是正则表达式,然后是流行的BeautifulSoup模块,最后是强大的lxml模块. 2.2.1 正则表达式 如果你对正则表达式还不熟悉,或是需要一些提示时,可以查阅https://docs.python.org/2/howto/regex.html 获得完整介绍. 当我们使用正则表达式抓取面积数据时,首先需要尝试匹配 元素中的内容,如下所示. >>> import re >>&

结合Scikit-learn介绍几种常用的特征选择方法

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

IIS5中的两种服务器端网页重定向方法

iis|服务器|网页|iis|服务器 IIS5中的两种服务器端网页重定向方法      在IIS5中提供了两种服务器端网页重定向(或者说转向)的方法, 一个是Server.Transfer方法, 另外一个是Server.Execute方法. 说它们是服务器端重定向,是因为在不同页面之间的转向是直接在服务器端 完成的, 客户端只能看到结果,而不能看到转向的过程. 这同以往我们在IIS4使用的 Response.Redirect 方法是不同的.      以前, 当我们需要从一个页面转向到另外一个页

字体设计:结合实践总结几种典型的设计方法

文章描述:中国汉字拥有约五千年的悠久历史,字体的形成也经历了漫长的发展与演变.字体设计是平面设计的重要组成部分,也是最完美的构成方式--用最简单的元素表现最丰富的效果,同时兼具功能性及内涵.自德国包豪斯设计构成理论引入中国以来,随着活字印刷和激光照排技术的发展 中国汉字拥有约五千年的悠久历史,字体的形成也经历了漫长的发展与演变.字体设计是平面设计的重要组成部分,也是最完美的构成方式--用最简单的元素表现最丰富的效果,同时兼具功能性及内涵.自德国包豪斯设计构成理论引入中国以来,随着活字印刷和激光照