Database 版 (精华区)

发信人: wodeji (西西), 信区: Database
标  题: [转载] PowerBuilder 开 发 系 列 谈 (4) 
发信站: 紫 丁 香 (Tue Sep 29 17:49:48 1998), 站内信件

【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】


 ---- 并 发 能 力 是 指 多 用 户 在 同 一 时 间 对 相 同 数 据 同 时 访 问 的 能 力。 一 般
 的 关 系 型 数 据 库 都 具 有 并 发 控 制 的 能 力, 但 是 这 种 并 发 功 能 也 会 对 数 据
 的 一 致 性 带 来 危 险。 试 想 若 有 两 个 用 户 都 试 图 访 问 某 个 银 行 用 户 的 记
 录 并 同 时 要 求 修 改 该 用 户 的 存 款 余 额 时, 情 况 将 会 怎 样 呢? 我 们 可 以
 对PowerBuilder 中 的DataWindow 进 行 设 置 来 进 行 并 发 控 制。 所 谓 并 发 控 制 就
 是 指 在 用 户 数 据 修 改 的 过 程 中 保 证 该 数 据 不 被 覆 盖 或 改 变 的 方 式, 在 下
 面 的 例 子 中 我 们 将 看 到 如 何 设 置Da taWindow 来 控 制 开 发 访 问。 为 了 说 明
 问 题, 我 们 举 这 样 一 个 简 单 的 银 行 系 统 中 的 例 子, 某 用 户 的 存 款 状 况 如
 右: 

 ---- 我 们 假 设 事 情 的 经 过 是 这 样 的: 公 司 的 某 员 工 在 银 行 前 台 取 款2,000
 元, 银 行 出 纳 查 询 用 户 的 存 款 信 息 显 示 银 行 存 款 余 额20,000 元; 正 在 这 时,
 另 一 银 行 帐 户 转 帐 支 票 支 付 该 帐 户5,0 00 元, 机 器 查 询 也 得 到 当 前 用 户 存
 款20,000 元, 这 时 银 行 的 出 纳 员 看 到 用 户 存 款 超 过 了 取 款 额 , 就 支 付 了 客
 户2,000 元 并 将 用 户 存 款 改 为18,000 元, 然 后 银 行 的 另 一 名 操 作 员 根 据 支
 票, 将 汇 入 的5,000 元 加 上, 把 用 户 的 余 额 改 为25,000 元, 那 么 数 据 库 管 理 系
 统 是 否 可 以 接 受 这 些 修 改 呢? 

 ---- 在DataWindows 的 设 计 中, 我 们 选 择 菜 单Rows|Update …, 会 出 现Specify Update
 Charac teristics 的 设 置 窗 口, 在 这 个 窗 口 中 我 们 设 置Update 语 句 中Where 子 句
 的 生 成, 以 此 来 进 行 开 发 控 制。 在 这 里 有 三 个 选 项, 我 们 分 别 看 一 看 在 本
 例 中 这 三 个 选 项 的 结 果: 

 ----(1)Key Columns: 生 成 的Where 子 句 中 只 比 较 表 中 的 主 键 列 的 值 与 最 初 查
 询 时 是 否 相 同 来 确 定 要 修 改 的 记 录。 在 上 述 的 例 子 中, 转 帐 支 票 的 操 作
 将 覆 盖 出 纳 员 作 出 的 修 改, 这 样 银 行 损 失 两 千 元。 

 ----(2)Key and Updateable Columns: 生 成 的Where 子 句 比 较 表 中 主 键 列 和 可 修 改
 列 的 值 与 最 初 查 询 时 否 是 相 同。 在 上 例 中 两 次 查 询 出 的 结 果 都 是 有 两
 万 余 额, 当 第 一 个 人 修 改 余 额 时 , 余 额 仍 是 二 万 元, 所 以 修 改 成 立, 而 支 票
 转 帐 操 作 时 余 额 已 不 是 二 万, 所 以 该 列 不 匹 配, 修 改 失 败。 

 ----(3)Key and Modified Columns:Where 子 句 比 较 主 键 和 将 要 修 改 的 列, 在 本 例
 中, 结 果 与 Key and Updateable Columns 的 选 择 相 同, 因 为 余 额 已 改 变, 不 再 与 最
 初 的 查 询 相 同, 因 此 仍 然 不 能 修 改。 

 ---- 让 我 们 作 另 外 一 个 假 设, 我 们 把 银 行 后 台 作 支 票 转 帐 操 作 改 为 冻 结
 用 户 存 款, 即 把 状 态 字 段 的 值 改 为 冻 结, 而 且 事 件 发 生 的 次 序 如 下 表, 那
 么 表 中 的 次 序4 … 前 台 出 纳 的 修 改 能 不 能 成 立 呢: 

 ----1.Key Columns:Where 子 句 只 比 较 主 键 值, 显 然 出 纳 员 的 修 改 是 允 许 的。 

 ----2.Key and Updateable Columns: 生 成 的Where 子 句 包 括 比 较 所 有 可 修 改 的 列,
 因 此 出 纳 修 改 时Statue 字 段 为 冻 结 与 出 纳 查 询 时 的tive 不 符, 修 改 失 败, 同
 时 显 示 错 误 信 息。 

 ----3.Key and Modified Columns:Where 子 句 的 比 较 包 括 主 键 和 要 修 改 的 列, 由 于
 本 列 中 修 改 列 仍 为20,000 元 没 有 变 化, 所 以 出 纳 的 修 改 可 以 成 立。 

 ---- 在 本 例 中, 我 们 可 以 看 到Key and Updateable Columns 的 选 项 最 严 格, 可 以 避
 免 出 现 状 态 列 发 生 改 变 时 余 额 作 修 改 的 错 误, 但 是 这 也 会 禁 止 我 们 作 一
 些 本 当 允 许 的 并 发 修 改, 如 出 纳 修 改 存 款 余 额, 而 业 务 员 修 改 用 户 的 联
 系 地 址 等。 因 此 我 们 应 当 根 据 实 际 情 况, 选 择 适 当 的Upd ate 设 置。 

 ---- 根 据 我 们 使 用 数 据 库 的 不 同, 我 们 还 有 一 些 其 他 的 控 制 并 发 访 问 和
 修 改 的 选 择 方 案, 如 对 数 据 加 锁。 锁 是 一 个 用 户 避 免 其 他 用 户 对 指 定 行
 作 修 改 的 操 作。 在 结 束 一 个 事 务 如 执 行com mit,rollback,disconnect 等 语 句 时
 自 动 将 锁 释 放。 如 果 您 使 用 的DBMS 支 持 锁 的 操 作, 在Pow er-Builder
 的DataWindow 设 计 时,Select 语 句 可 在from 子 句 中 加 上with holdlock: 即 在data
 Window 的SQL Window 中, 在 表 窗 口 的 标 题 处 点 击 右 鼠 标, 弹 出 菜 单 的 最 后
 一 个 选 项 即 为Hold lock。 选 择 该 项, 生 成 的SQL 语 句 将 在re-trievel() 函 数 执 行
 后 将 所 查 询 的 数 据 加 锁, 以 避 免 其 他 用 户 的 修 改 访 问, 直 至commit,rollback
 等 事 件 发 生 后 解 锁。 这 种 方 式 带 来 的 问 题 是, 当 用 户 查 询 完 数 据 后 可 能
 离 开 计 算 机 长 时 间 不 用, 这 段 时 间 内 其 他 用 户 均 无 法 修 改 数 据。 此 外 有
 些DBMS 如Sybase 等 不 支 持 行 级 锁, 也 就 是 说 当 你 对 某 一 行 查 询 时 更 多 的
 行 都 被 上 了 锁, 这 就 更 增 加 了 并 发 处 理 的 局 限 性。 另 一 个 值 得 注 意 的 问
 题 是 在 多 窗 口 应 用 中 某 一 个 窗 口 的 事 务 提 交 将 会 导 致 使 用 一 事 务 中 其
 他 数 据 窗 口 的 查 询 行 解 锁, 这 时 修 改 将 可 能 发 生 错 误。 某 些DBMS 系 统 支
 持 一 个 称 作" 时 间 戳(timestamp)" 的 数 据 项 来 控 制 并 发 性。 每 张 表 中 都 有 一
 个 时 间 戳 的 数 据 列, 当Insert 语 句 或Update 语 句 对 数 据 行 作 修 改 时 该 列 自 动
 被 修 改 为 当 前 时 间。 当 你 要 作 修 改 时,where 子 句 可 检 查 时 间 戳 列 在 查 询
 时 和 修 改 时 两 个 值 是 否 相 符, 以 此 来 确 保 您 作 出 的 修 改 不 会 覆 盖 别 人 的
 修 改, 因 此 这 种 确 认 方 式 与key and Updateable Columns 选 项 相 同 。 即 使 两 个 用
 户 对 同 一 行 的 不 同 列 作 修 改, 后 一 个 修 改 者 也 将 失 败。 在 常 用 的 关 系 型
 数 据 库 中Sybase 和Microsoft 的SQL Server 支 持 时 间 戳 的 使 用。 而 在PowerBuilder
 中, 不 管 用 户 后 台 连 接 何 种 数 据 库, 只 要 表 中 带 有timestamp 的 列 名 且 数 据
 类 型 为datetime,PB 将 自 动 忽 略Upda te characteristics 的 选 项, 而 在where 子 句 中 生
 成 主 键 和 时 间 戳 列 的 比 较。 

 ---- 如 果 您 所 用 的 数 据 库 不 支 持 时 间 戳 但 支 持 触 发 器, 您 也 可 以 在 表 中
 增 加 一 列 整 数 型 的 列 。 当 有 对 表 中 某 种 记 录 作 修 改 时, 该 列 自 动 加1。
 下 列 使 用 的 是Watcom 数 据 库, 对Shipper 表 增 加Updcnt 字 段 并 作 两 个 触 发 器,
 这 样 任 何 用 户 或 进 程 试 图 修 改 某 行 记 录 时, 该 字 段 均 可 发 生 变 化。 

 ---- 对INSERT 触 发 器 的 编 写 如 下: 

 ----DROP TRIGGER INS —SHIPPER’ 

 ----CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER 

 ----REFERENCING NEW AS Newvalue 

 ----FOR EACH ROW 

 ---- BEGIN 

 ---- SET newvalue.UpdCnt=newvalue.UpdCnt+1; 

 ---- END' 

 ---- 同 理 可 编 写UPDATE 触 发 器。 

 ---- 在 您 的PowerBuilder 应 用 之 中, 除 表 的 主 键 外, 必 须 再 加 上 这 一 列 作 为 检
 测 列 加 入Updat e 语 句 中 的Where 子 句 中, 这 样 再 作Update 操 作 时, 后 台 数 据 库
 会 比 较 修 改 时 与 用 户 作Retriev e 操 作 时 数 据 是 否 相 等, 以 确 认 是 否 能 作 修
 改。 在DataWindows 中 在Specify Update Charact eris-tics 的 对 话 框 的 右 下 角 的Unique
 key column(s) 中 加 上Updcnt 一 项, 同 时 注 意where c lause 中 选 择Key columns, 这
 样PowerBuilder 在 构 造where 子 句 时 就 会 认 为Updcnt 亦 是 表 的 主 键, 而 成 为 检
 测 项。 

 ---- 当 数 据 窗 口 的Update 函 数 被 调 用 后, 触 发 器 将 修 改 过 记 录 中 的Updcnt 列
 表 为 新 值, 为 保 证 下 一 次 修 改 能 够 有 效, 您 应 当 立 即 作Retrieve() 以
 使DataWindow 缓 冲 区 中Updcnt 的 值 与 数 据 库 相 同。 显 然 修 改 后 立 即 查 询 的
 代 价 要 比 其 他 任 何 一 种 并 

 ---- 发 控 制 的 代 价 要 小 得 多。 

                       


--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.97.236.132]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: whs.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.498毫秒