DB2隔离级别和锁 - 图文(6)

2019-02-15 22:51

(1) MANAGER1 执行下面的 SELECT 语句: SELECT RID_BIT(EMPLOYEE), ROW CHANGE TOKEN FOR EMPLOYEE, EMPNO, FIRSTNME, LASTNAME, PHONENO, ROWCHGTS FROM EMPLOYEE FETCH FIRST 3 ROWS ONLY (2) SELECT 的输出结果如下: 乐观锁定表达式 EMPLOYEE 表 RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 74904229642240 000010 CHRISTINE HAAS 3978 0001-01-01 00:00:00.000000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (3) MANAGER1 执行下面的 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240 (4) UPDATE 的输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 141285645885181032 000010 CHRISTINE HAAS 1092 2008-12-20 11:55:45.593000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000

在上面的这个场景中,我们可以看到当MANAGER1执行UPDATE操作后,EMPLOYEE表中 ROW CHANGE TIMESTAMP 字段从默认的“ 0001-01-01:00:00:00.000000 ”变为“ 2008-12-20:11:55:45.59 ”,也就是进行更改的那个时刻的时间戳。 场景 2

EMPLOYEE 表包含一个隐式隐藏的 ROW CHANGE TIMESTAMP 列,并且 MANAGER1 和

MANAGER2 同时访问该表。 MANAGER1 从 EMPLOYEE 表中选择数据并稍后尝试更新这些数据。然

而,从他选择这些数据到执行更新期间,MANAGER2 对相同的数据进行了更新。 MANAGER2 执行的更新成功,而 MANAGER1 执行的更新失败。主要步骤如下: (1) MANAGER1 和 MANAGER2 执行 SELECT 的输出结果如下所示: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 74904229642240 000010 CHRISTINE HAAS 3978 0001-01-01 00:00:00.000000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (2) MANAGER2 执行下面的 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240 (3) MANAGER2 执行 UPDATE 的输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 141285645885181032 000010 CHRISTINE HAAS 1092 2008-12-20 11:55:45.593000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (4) MANAGER1 执行下面 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240

(5) MANAGER1 执行 UPDATE 失败,返回 SQL0100W 信息。

MANAGER1 的更新失败。由于 MANAGER2 执行了UPDATE,ROW CHANGE TOKEN 发生了改变,因此,当将执行SELECT时取回的标记与由 MANAGER2 的应用程序更新后的当前值进行比较时,MANAGER1 的 UPDATE 语句的 ROW CHANGE TOKEN 谓词失败。因此UPDATE无法找到指定的行,返回消息“SQL0100W No row was found for FETCH, UPDATE or DELETE;

or the result of a query is an empty table. SQLSTATE=02000 ”。

场景 3

EMPLOYEE 表包含一个隐式隐藏的 ROW CHANGE TIMESTAMP 列,并且 MANAGER1 和 MANAGER2 同时访问该表。 MANAGER1 对行进行了更新,但还未提交修改。 MANAGER2 使用 UR 隔离级别从 EMPLOYEE 表中选择数据。 MANAGER1 提交他做出的修改。 MANAGER2 尝试对相同的数据进行更新。 MANAGER2 执行更新成功,因为应用程序读取的是 MANAGER1 未提交的更新。然而,如果 MANAGER1 回滚更新而不是提交更新,MANAGER2 的更新将失败。这个场景的主要步骤如下: (1) MANAGER1 执行 SELECT 的输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 74904229642240 000010 CHRISTINE HAAS 3978 0001-01-01 00:00:00.000000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (2) MANAGER1 执行如下的 UPDATE 语句,未提交确认: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240 (3) MANAGER2 使用隔离级别 UR 执行 SELECT 的结果输出如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 141285665533242120 000010 CHRISTINE HAAS 1092 2008-12-20 16:47:03.125000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (4) MANAGER1 提交 UPDATE 语句,提交后输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'0400400100000000 0000000000FA9023' 141285665533242120 000010 CHRISTINE HAAS 1092 2008-12-20 16:47:03.125000 x'0500400100000000 0000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'0600400100000000 0000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 (5) MANAGER2 执行如下的 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1090') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=141285665533242120 (6) MANAGER1 提交修改而 MANAGER2 尝试更新相同的数据,结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 141285667099502664 000010 CHRISTINE HAAS 1090 2008-12-20 16:51:53.125000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000 MANAGER2 最后执行的更新成功,因为应用程序从 MANAGER1 处读取的是未提交的更新; MANAGER2 的UPDATE语句中的ROW CHANGE TOKEN谓词成功,因为 MANAGER1 使用新标记提交了修改。 (7) MANAGER1 发出 ROLLBACK 而不是 COMMIT 时的输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO ROW CHANGE TIMESTAMP x'04004001000000000000000000FA9023' 74904229642240 000010 CHRISTINE HAAS 3978 0001-01-01 00:00:00.000000 x'05004001000000000000000000FA9023' 74904229642240 000020 MICHAEL THOMPSON 3476 0001-01-01 00:00:00.000000 x'06004001000000000000000000FA9023' 74904229642240 000030 SALLY KWAN 4738 0001-01-01 00:00:00.000000

MANAGER1 对修改执行回滚后,MANAGER2 试图根据 MANAGER1 的未提交的UPDATE执行数据更新, MANAGER2 最后执行的更新失败,因为当 MANAGER1 回滚到初始标记时,ROW CHANGE

TOKEN谓词失败,因此UPDATE无法找到特定行。

场景 4

EMPLOYEE 表不包含 ROW CHANGE TIMESTAMP 列,并且 MANAGER1 和 MANAGER2 同时访问该表。 MANAGER1 选择一行并尝试更新它。然而,从他进行选择到更新期间,MANAGER2 更新了同

一数据页中的其他数据 ( 不一定与 MANAGER1 处理的数据相同,但是位于另一行中 ) 。因此,当 MANAGER1 尝试更新数据时,更新将会失败。 这个场景的主要步骤如下: (1) MANAGER2 执行如下 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240 (2) MANAGER2 执行 UPDATE,成功后的输出结果如下: RID_BIT ROW CHANGE TOKEN EMPNO FIRSTNME LASTNAME PHONENO x'04004001000000000000000000FA9023' 141285645885181032 000010 CHRISTINE HAAS 1092 x'05004001000000000000000000FA9023' 141285645885181032 000020 MICHAEL THOMPSON 3476 x'06004001000000000000000000FA9023' 141285645885181032 000030 SALLY KWAN 4738 (3) MANAGER1 试图对同一数据页中的另一行执行更新,UPDATE 语句如下所示: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('MICHAEL','THOMPSON','9012') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240 MANAGER1 执行更新失败,因为在比较标记时,由于所有行的 ROW CHANGE TOKEN 值发生了变化 ( 即使 MANAGER1 尝试进行更新的行实际上也没有发生变化 ),ROW CHANGE TOKEN谓词失败。如果向 EMPLOYEE 表添加行修改时间戳列,则误判场景中的UPDATE不会发生失败。 场景 5 EMPLOYEE 表创建时不包含 ROW CHANGE TIMESTAMP 列,但建表后添加了一个 ROW CHANGE TIMESTAMP 列。 MANAGER1 和 MANAGER2 访问该表。 MANAGER1 从中选择一行并尝试更新。然而,从他进行选择到更新期间,MANAGER2 更新了同一数据页中的其他数据 ( 不一定与 MANAGER1 处理的数据相同,而是位于另一行中 ) 。由于已经添加了 ROW CHANGE TIMESTAMP 列,所以如果对不同行进行更新,即使位于相同页面,更新也会成功。这个场景的主要步骤如下: (1) MANAGER2 执行如下的 UPDATE 语句: UPDATE EMPLOYEE SET (FIRSTNME,LASTNAME,PHONENO) = ('CHRISTINE','HAAS','1092') WHERE RID_BIT(EMPLOYEE)=x'04004001000000000000000000FA9023' AND ROW CHANGE TOKEN FOR EMPLOYEE=74904229642240

(2) MANAGER2 执行 UPDATE,成功后的输出结果如下:


DB2隔离级别和锁 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:自然辩证法复习题及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: