一、并 发 控制
数据 库 是一个共享 资 源,可 为 多个 应 用程序所共享。 这 些程序可串行运行,但在 许 多情况下,由于 应 用程序 涉 及的数据量可能很大,常常会 涉 及 输 入 / 输 出的交 换 。 为 了有效地利用数据 库资 源,可能多个程序或一个程序的多个 进 程并行地运行, 这 就是数据 库 的并行操作。在多用 户 数据 库环 境中,多个用 户 程序可并行地存取数据 库 ,如果不 对 并 发 操作 进 行控制,会存取不正确的数据,或破坏数据 库 数据的一致性。
1 ) 数据 库 不一致的 类 型
◎ 不一致性
在一事 务 期 间 ,其它提交的或未提交事 务 的修改是 显 然的,以致由 查询 所返回的数据集不与任何点相一致。
◎ 不可重 复读
在一个事 务 范 围 内,两个相同 查询 将返回不同数据,由于 查询 注意到其它提交事 务 的修改而引起。
◎ 读脏 数据
如果事 务 T1 将一 值 ( A )修改,然后事 务 T2 读该值 ,在 这 之后 T1 由于某 种 原因撤 销对该值 的修改, 这样 造成 T2 读 取的 值 是 脏 的。
◎ 丢 失更改
在一事 务 中一修改重写另一事 务 的修改。
◎ 破坏性的 DDL 操作
在一用 户 修改一表的数据 时 ,另一用 户 同 时 更改或 删 除 该 表。
2 )封 锁
在多用 户 数据 库 中一般采用某些数据封 锁 来解决并 发 操作中的数据一致性和完整性 问题 。封 锁 是防止存取同一 资 源的用 户 之 间 破坏性的干 扰 的机制, 该 干 扰 是指不正确地修改数据或不正确地更改数据 结 构。
在多用 户 数据 库 中使用两 种 封 锁 :排它( 专 用)封 锁 和共享封 锁 。排它封 锁 禁止相 关资 源的共享,如果一事 务 以排它方式封 锁 一 资 源, 仅仅该 事 务 可更改 该资 源,直至 释 放排它封 锁 。共享封 锁 允 许 相 关资 源可以共享,几个用 户 可 同 时读 同一数据,几个事 务 可在同一 资 源上 获 取共享封 锁 。共享封 锁 比排它封 锁 具有更高的数据并行性。
在多用 户 系 统 中使 用封 锁 后会出 现 死 锁 ,引起一些事 务 不能 继续 工作。当两个或多个用 户 彼此等待所封 锁 数据 时 可 发 生死 锁 。
3 ) ORACLE 多 种 一致性模型。
ORACLE 利用事 务 和封 锁 机制提供数据并 发 存取和数据完整性。在一事 务 内由 语 句 获 取的全部封 锁 在事 务 期 间 被保持,防止其它并行事 务 的破坏性干 扰 。一个事 务 的 SQL 语 句所作的修改在它提交之后所启 动 的事 务 中才是可 见 的。在一事 务 中由 语 句所 获 取的全部封 锁 在 该 事 务 提交或回 滚时 被 释 放。
ORACLE 在两个不同 级 上提供 读 一致性: 语 句 级读 一致性和事 务级 一致性。 ORCLE 总 是 实 施 语 句 级读 一致性,保 证单 个 查询 所返回的数据与 该查询开 始 时 刻相一致。所以一个 查询 从不会看到在 查询执 行 过 程中提交的其它事 务 所作的任何修改。 为 了 实现语 句 级读 一致性,在 查询进 入 执 行 阶 段 时 ,在注 视 SCN 的 时 候 为 止所提交的数据是有效的,而在 语 句 执 行 开 始之后其它事 务 提交的任何修改, 查询 将是看不到的。
ORACLE 允 许选择实 施事 务级读 一致性,它保 证 在同一事 务 内所有 查询 的数据
4 )封 锁 机制
ORACLE 自 动 地使用不同封 锁类 型来控制数据的并行 存取,防止用 户 之 间 的破坏性干 扰 。 ORACLE 为 一事 务 自 动 地封 锁 一 资 源以防止其它事 务对 同一 资 源的排它封 锁 。在某 种 事件出 现 或事 务 不再需要 该资 源 时 自 动 地 释 放。
ORACLE 将封 锁 分 为 下列 类 :
◎ 数据封 锁 :数据封 锁 保 护 表数据,在多个用 户 并行存取数据 时 保 证 数据的完整性。数据封 锁 防止相冲突的 DML 和 DDL 操作的破坏性干 扰 。 DML 操作可在两个 级获 取数据封 锁 :指定行封 锁 和整个表封 锁 ,在防止冲突的 DDL 操作 时 也需表封 锁 。当行要被修改 时 ,事 务 在 该 行 获 取排它数据封 锁 。表封 锁 可以有下列方式:行共享、行排它、共享封 锁 、共享 行排它和排它封 锁 。
◎ DDL 封 锁 (字典封 锁 )
DDL 封 锁 保 护 模式 对 象(如表)的定 义 , DDL 操作将影响 对 象,一个 DDL 语 句 隐 式地提交一个事 务 。当任何 DDL 事 务 需要 时 由 ORACLE 自 动获 取字典封 锁 ,用 户 不能 显 式地 请 求 DDL 封 锁 。在 DDL 操作期 间 ,被修改或引用的模式 对 象被封 锁 。
◎ 内部封 锁 :保 护 内部数据 库 和内存 结 构, 这 些 结 构 对 用 户 是不可 见 的。
5 )手工的数据封 锁
下列情况允 许 使用 选择 代替 ORACLE 缺省的封 锁 机制:
◎ 应 用需要事 务级读 一致或可重 复读 。
◎ 应 用需要一事 务对 一 资 源可 排它存取, 为 了 继续 它的 语 句,具有 对资 源排它存取 的事 务 不必等待其它事 务 完成。
ORACLE 自 动 封 锁 可在二 级 被替代:事 务级 各系 统级 。
◎ 事 务级 :包含下列 SQL 语 句 的事 务 替代 ORACLE 缺省封 锁 : LOCK TABLE 命令、 SELECT…FOR UPDATE 命令、具有 READ ONLY 选项 的 SET TRANSACTIN 命令。 由 这 些 语 句所 获 得的封 锁 在事 务 提交或回 滚 后所 释 放。
◎ 系 统级 :通 过调 整初始化参数 SERIALIZABLE 和 REO-LOCKING , 实 例可用非缺省封 锁 启 动 。 该 两参数据的缺省 值为 :
SERIALIZABLE=FALSE
ORW-LOCKING=ALWAY S