数据库的事务管理在线教程
数据库的事务管理
--------------------------------------------------------------------------------
---- 在 数 据 库 中, 所 谓 事 务 是 指 一 组 逻 辑 操 作 单 元, 使 数 据 从 一 种 状 态 变 换 到 另 一 种 状 态。 为 确 保 数 据 库 中 数 据 的 一 致 性, 数 据 的 操 纵 应 当 是 离 散 的 成 组 的 逻 辑 单 元: 当 它 全 部 完 成 时, 数 据 的 一 致 性 可 以 保 持, 而 当 这 个 单 元 中 的 一 部 分 操 作 失 败, 整 个 事 务 应 全 部 视 为 错 误, 所 有 从 起 始 点 以 后 的 操 作 应 全 部 回 退 到 开 始 状 态。
---- 对 事 务 的 操 作 是 这 样 进 行 的: 先 定 义 开 始 一 个 事 务, 然 后 对 数 据 作 修 改 操 作, 这 时 如 果 提 交(COMMIT), 这 些 修 改 就 永 久 地 保 存 下 来, 如 果 回 退(ROLLBACK), 数 据 库 管 理 系 统 将 放 弃 您 所 作 的 所 有 修 改 而 回 到 开 始 事 务 时 的 状 态。 此 外 有 些 数 据 库 支 持 事 务 的" 存 储 点(savepoint) 这 一 概 念: 即 在 一 个 事 务 进 程 中 任 意 一 点 您 都 可 以 进 行 当 前 状 态 的 存 储, 回 退 时 只 是 回 到 你 所 设 定 的 存 储 点, 而 不 必 退 回 全 部 的 事 务。 如 果 您 的 事 务 可 以 分 成 几 组 对 数 据 库 的 修 改, 那 就 可 以 设 置 多 个 存 储 点, 根 据 需 要 您 可 以 回 退 到 任 意 一 个 存 储 点, 而 不 使 所 有 事 务 的 修 改 数 据 全 部 丢 失。
---- 正 确 地 管 理 事 务 可 以 保 证 数 据 的 完 整 性, 当 您 所 做 的 工 作 全 部 完 成 和 得 到 确 认 之 前, 没 有 任 何 数 据 物 理 地 写 进 数 据 库。 让 我 们 来 看 这 样 一 个 实 例, 我 们 有 这 样 一 个 银 行 应 用 系 统, 前 台 使 用 者 作 出 将 储 户 甲 的 一 百 元 存 款 划 归 储 户 乙 帐 下 的 操 作; 在 后 台 的 数 据 库 中, 这 两 个 客 户 的 记 录 分 储 在 两 张 表 中, 当 使 用 者 在 屏 幕 上 作 出 如 上 操 作 时, 在 后 台 需 要 对 两 张 表 进 行 修 改。 如 果 在 数 据 库 中 对 甲 用 户 存 款 余 款 作 减 去 一 百 元 修 改 后, 对 乙 用 户 加 一 百 元 的 操 作 修 改 却 失 败 时, 前 一 张 表 也 必 须 回 到 修 改 前 的 状 态, 否 则 数 据 库 的 内 容 不 统 一, 甲 储 户 白 白 损 失 一 百 元, 信 息 必 然 是 不 正 确 的。 因 此 进 行 事 务 管 理 是 必 须 的。
---- 传 统 地, 我 们 认 为 一 个 事 务 包 括 了 对 一 个 或 多 个 表 的 修 改, 而 随 着 分 布 式 数 据 库 和 数 据 仓 库 的 发 展, 事 务 可 能 包 括 了 对 一 个 或 多 个 数 据 库 的 修 改。 在 上 例 中 甲 乙 两 用 户 就 可 能 是 异 地 用 户, 信 息 分 储 在 不 同 地 域 的 不 同 数 据 库 中, 上 述 的 一 个 事 务 就 涉 及 到 了 对 不 同 数 据 库 的 操 作 。
PowerBuilder 中 的 事 务 管 理
---- 作 为 数 据 库 的 前 台 开 发 工 具Power-Builder 支 持 事 务 管 理 的 操 作。 在Power-Builder 中 有 一 种 称 作 事 务(transaction) 的 对 象, 这 个 对 象 是PowerBuilder 应 用 与 数 据 库 的 通 讯 区 域。P owerBuilder 在 应 用 开 始 时 建 立 一 个 全 局 的 事 务 对 象SQLCA。 由 于 大 多 数 的 应 用 只 用 到 一 个 数 据 库, 所 以 一 般 开 发 者 主 要 也 只 用SQLCA 作 为 与 唯 一 数 据 库 连 接 的 事 务 对 象。
----PowerScript 中 常 用 的 事 务 管 理 的 语 句 有 四 个:COMMIT,ROLLBACK,CONNECT,DISCONNECT。
---- 当 您 需 要 应 用 与 数 据 库 建 立 连 接 时 使 用CONNECT 这 一 操 作 命 令, 取 消 连 接 时 执 行DISCONN ECT, 这 两 个 命 令 一 般 分 别 用 在 应 用 的 开 始 和 结 束, 也 就 是Appli-cation 的Open 和Close 事 件 中 。
---- 当 一 个 事 务 的 数 据 库 修 改 都 成 功 地 完 成 后, 修 改 须 提 交 给 数 据 库,COM-MIT 语 句 是 一 个 旧 事 务 结 束 和 一 个 新 事 务 开 始 的 界 线。 在 修 改 被 提 交 前, 数 据 库 的 数 据 并 没 有 被 真 正 地 修 改, 这 些 修 改 被 保 留 在 某 个 工 作 区, 只 有 作 修 改 的 用 户 才 能 看 到 这 些 被 修 改 后 的 值, 提 交 之 后, 则 所 有 的 用 户 就 都 可 以 看 到 新 值 了。
---- 在 事 务 的 进 程 中 发 生 某 些 错 误, 或 者 在 操 作 中 出 于 种 种 原 因 打 算 中 止 事 务, 须 用ROLLBAC K 命 令 回 退 事 务, 如 果 已 作 的 操 作 不 用ROLLBACK 命 令 取 消, 这 些 操 作 必 将 错 误 地 作 为 下 一 个 事 务 的 一 部 分 而 导 致 数 据 库 的 混 乱。
---- 如 果 您 使 用 的 是 多 窗 口 的 应 用, 却 只 用 一 个 事 务 对 象, 就 应 格 外 注 意ROLL-BACK 和COMMIT 会 影 响 事 务 的 逻 辑 一 致 性。 在 某 个 窗 口 执 行 的 这 两 个 指 令 会 使 其 他 窗 口 应 用 中 所 进 行 到 一 半 的 工 作 提 交 或 回 退。
---- 在 多 用 户 系 统 中, 修 改 和 提 交 的 时 间 越 接 近, 提 交 成 功 的 可 能 性 就 越 高。 因 为 一 个 事 务 中 所 有 的SQL 语 句 全 部 执 行 成 功 而 提 交 却 失 败 是 完 全 可 能 发 生 的, 例 如 在 您 的 事 务 过 程 中, 另 一 个 用 户 修 改 了 数 据 并 提 交, 这 很 可 能 使 您 作 出 的 修 改 无 效, 这 时COMMIT 将 失 败, 您 必 须 回 退 这 一 事 务 的 全 部。
事 务 对 象 的AutoCommit 属 性
---- 事 务 对 象 有 一 个AutoCom-mit 的 属 性 可 以 使 开 发 者 简 化 对 事 务 管 理 的 操 作, 这 一 布 尔 型 的 属 性 可 以 用TRUE 或FALSE 来 对 其 赋 值。 当 其 为 真 时,PowerBuilder 不 通 过 其 他 额 外 的 交 互 就 将 您 的SQL 语 句 传 输 给 后 台 数 据 库, 而 且 执 行 完 毕 自 动 提 交。
---- 当 然, 您 可 以 设 置AutoCommit 属 性 为 假( 缺 省 值), 使 用COMMIT 或ROLLBACK 这 样 的 关 键 词 提 交 或 回 退 事 务。 在 大 多 数 应 用 中, 一 部 分 的 数 据 库 操 作 是 要 成 组 提 交 的, 而 另 一 些 则 不 用。 因 此 我 们 可 以 利 用AutoCommit 的 特 性 来 确 定 事 务 的 起 点, 当 我 们 把AutoCommit 的 属 性 设 为Fals e 时, 系 统 设 定 此 时 为 事 务 的 起 点。 当AutoCommit 设 为 真 时, 系 统 自 动 消 取 这 一 事 务。 因 此 你 可 以 先 把AutoCommit 设 为 真, 当 您 需 要 开 始 一 个 事 务 时, 将 其 置 为false, 此 刻 即 为 事 务 起 始 点 。
----PowerBuilder 内 部 这 种 事 务 管 理 的 最 大 优 点 是 方 便。 您 不 去 考 虑 整 个 事 务, 而 只 需 把 您 所 作 的 修 改 提 交 或 滚 回 即 可。 但 是 方 便 与 可 控 性 总 是 矛 盾 的, 在Power-Builder 中 没 有 存 储 点 和 嵌 套 事 务 管 理 的 机 制, 即 使 您 所 使 用 的 数 据 库 支 持 这 些 特 性, 在PowerBuilder 中 却 无 法 得 以 体 现。 不 过 在 普 通 的 应 用 中, 存 储 点 和 嵌 套 事 务 管 理 并 不 是 必 须 的, 一 般 的 事 务 管 理 足 以 够 用 。
用 数 据 库 的 事 务 管 理 指 令 实 现 完 全 控 制
---- 上 述 的 事 务 管 理 方 式 尽 管 简 单 方 便, 但 是 在 某 些 应 用 中, 我 们 也 的 确 需 要 利 用 所 用 的 数 据 库 系 统 的 嵌 套 事 务 和 存 储 点 的 特 性, 而PowerBuilder 内 部 的 事 务 管 理 没 有 提 供 这 样 的 功 能, 您 必 须 自 己 设 计。
---- 自 己 进 行 事 务 管 理 的 方 式 是 直 接 使 用 数 据 库 本 身 的 事 务 指 令。 当 您 使 用 自 己 的 管 理 方 式 时, 就 应 使Power-Builder 停 止 管 理 事 务, 即 设 置Auto-Commit 为TRUE, 系 统 内 部 就 不 会 自 动 建 构 事 务 处 理 的 命 令 了。 实 现 人 工 事 务 管 理 的 方 式 是 采 用EXECUTE IMMEDIATE 这 条PowerBuild er 指 令 来 执 行 任 意 的 数 据 库 操 作。 你 所 需 做 的 是 将 数 据 库 指 令 编 辑 成 一 个 字 符 串, 您 可 以 执 行 任 何 的 数 据 定 义 语 句 如 建 表、 建 主 键、 存 储 过 程 等, 例 如 您 可 以 用
----EXECUTE IMMEDIATE BEGIN TRANSACTION trans-name
---- 这 样 的 指 令 开 始 一 个 事 务。 采 用 这 种 方 法, 只 要 您 所 用 的 数 据 库 支 持 嵌 套 事 务 和 存 储 点 等 事 务 管 理, 我 们 通 过PowerBuilder 开 发 出 的 应 用 也 就 同 样 可 以 实 现。
---- 在PowerBuilder 中 提 供 的 事 务 管 理 的 方 法 是 多 种 多 样 的, 只 要 您 灵 活 运 用, 就 一 定 能 设 计 出 优 秀 的 数 据 库 应 用 来。