1、1 数据库原理与应用 6.1 6.2 6.3 第6 章 数据库的事务处理与数据恢复 2 数据库原理与应用 6.1.1 Transaction 6.1.2 6.1.3 6.1.4 SQL Server 6.1 事务管理的基本概念 3 数据库原理与应用 如 在 银 行 业 务 中 , “ 从帐户A 转 移 资 金X 到 帐户 就 是 一 个 典 型 的 事 务 。 这 个 事 务 可 以 分 解 为 两 个 动 作 : (1 ) 从账户A 减 去 金 额X 。 (2 ) 在账户B 中 加 上 金 额X 。 6.1 事务的概念 4 数据库原理与应用 1 BEGIN_TRANSACTION 2 Rea
2、d/Write 3 END_TRANSACTION / 4 COMMIT_TRANSACTION / 6.1.2 事务的状态 5 数据库原理与应用 6.1.2 事务的状态 SQL Server 2000 BEGIN TRANSACTION - UPDATE book SET IF ERROREXEC dbms_transaction.rollback( A ) 6.1.4 ORACLE 中的事务 16 数据库原理与应用 17 数据库原理与应用 5 SET TRANSACTION READ ONLY 6.1.4 ORACLE 中的事务 18 数据库原理与应用 19 数据库原理与应用 6.2 并发
3、控制 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 ORACLE 20 数据库原理与应用 6.2.1 并发操作引起的问题 (1 ) 事务T 1 ( 动作1 ) : 甲 售 票 员 读 出 某 航 班 的 机 票 余 额A , 设A=16。 (2 ) 事务T 2 ( 动作1 ) : 乙 售 票 员 读 出 同 一 航 班 的 机 票 余额,A也为16 。 (3 ) 事务T 1 ( 动作2 ) : 甲 售 票 员 卖 出 一 张 机 票 , 修改 机票余额 -1 , 所以A=15, 把A 写 入 数 据 库 。 (4 ) 事务T 2 ( 动作2 ) : 乙 售 票 员 卖 出 两 张
4、 机 票 , 修改 机票余额 -2 , 所以A=14, 把A 写 入 数 据 库 。 21 数据库原理与应用 1 Lost Update 2 Unrepeatable Read 3 Dirty Read 6.2.1 并 发 操 作 引 起 的问 题 22 数据库原理与应用 1 丢失修改 (Lost Update ) T 1 T 2 T 2 T 1 T 1 6-2 6.2.1 并 发 操 作 引 起 的问 题 23 数据库原理与应用 T 1 T 2t 1读A 16 t 2读A 16 t 3A=A-1 写回A 15 t 4A=A-2 写回A 14 (覆盖了T 1 对A的修改) 图6-2 丢失修改
5、6.2.1 并 发 操 作 引 起 的问 题 24 数据库原理与应用 2 不可重复读 (Unrepeatable Read ) T 1 A T 2 A 6-3 6.2.1 并 发 操 作 引 起 的问 题 25 数据库原理与应用 T 1 T 2t 1读A 50 读B 100 求和150 t 2读B 100 2 写回B=200 t 3读A 50 读B 200 求和250 ( 验算不对 ) 图6-3 不可重复读 6.2.1 并 发 操 作 引 起 的问 题 26 数据库原理与应用 3 读 “ 脏 ” 数据 (Dirty Read ) T 1 T 2 T 2 T 2 T 1 6-4 6.2.1 并
6、发 操 作 引 起 的问 题 27 数据库原理与应用 T 1 T 2t 1读B 100 写回B=200 t 2读B 200 (读入T 2 的脏数据) t 3ROLLBACK (B 恢复为100) 图6-4 读“脏”数据 6.2.1 并 发 操 作 引 起 的问 题 28 数据库原理与应用 6.2.2 封锁 1 Exclusive Lock X 若事务T 对 数 据 对 象A 加X 锁 , 则 只 允 许T 读 取 和 修改A , 其 他 任 何 事 务 都 不 能 再 对A 加 任 何 类 型 的锁, 直到T释放A上的锁 。 Share Lock S 若事务T 对 数 据 对 象A 加上S 锁
7、 , 则事务T 可 以 读 A , 但 不 能 修 改A ; 其 他 事 务 只 能 再 对A 加S 锁 , 不能加X 锁 , 直到T释放A上的S 锁 。 一个事务对某个数据对象加锁后究竟拥 有什么样的控制是由封锁类型决定的。 29 数据库原理与应用 6.2.2 封锁 30 数据库原理与应用 2 X S (1) 一级封锁协议 。 (2) 二级封锁协议 。 (3) 三级封锁协议 6.2.2 封锁 31 数据库原理与应用 1 T X T 例如 , 图6-6 使 用 一 级 封 锁 协 议 解 决 了 图6-2 中 的 丢 失 修 改 问 题 。 6.2.2 封锁 32 数据库原理与应用 T 1 T
8、 2t 1 Xlock A t 2 A 16 Xlock A t 3A=A-1 A 15 Commit Unlock A t 4 Xlock A A 15 A=A-2 A 13 Commit Unlock A 图6-6 没有丢失修改 33 数据库原理与应用 T 1 T 2t 1读A 50 读B 100 求和150 t 2XlockB 读B 100 2 写回B=200 Commit UnlockB t 3读A 50 读B 200 求和250 ( 验算不对 ) 图6-3-1 一级封锁协议不能保证可重复读 34 数据库原理与应用 T 1 T 2t 1XlockB 读B 100 写回B=200 t 2
9、读B 200 (读入T 2 的脏数据) t 3ROLLBACK (B 恢复为100) UnlockB 图6-4-1 一级封锁协议不能保证读“脏” 数据 35 数据库原理与应用 2 T S S 例如 , 图6-7 使用二级 封锁协议解决了图6-4 中读 “ 脏 ” 数 据 的 问 题 。 6.2.2 封锁 36 数据库原理与应用 T 1 T 2t 1Xlock B B 100 B=200 t 2SlockB t 3ROLLBACK (B 100) Unlock B t 4 Slock B B 100 Unlock B 图6-7 不读“脏”数据 37 数据库原理与应用 3 T S X 6-8 6-
10、3 6.2.2 封锁 38 数据库原理与应用 T 1 T 2t 1Slock A A 50 Slock B B 100 150 t 2XlockB t 3 A 50 B 100 150 Commit Unlock A Unlock B t 4 Xlock B 100 B=200 Commit Unlock B 图6-8 可重复读 39 数据库原理与应用 X S 一级 事务全程 加锁 不加锁 二级 事务全程 加锁 事务开始加锁,读完 即释放 三级 事务全程 加锁 事务全程加锁 6-1 40 数据库原理与应用 6.2.3 封锁出现的问题及解决方法 1 如果 事务T 1 封锁了数据R 后 ,T 2
11、也请求封锁R , 于是T 2 等待 。 接着T 3 也 请 求 封 锁R 。 假如T 1 释放R 上的锁后 , 系统首先批准了T 3 的请求 , T 2 只 得 继 续 等 待 。 接着T 4 也 请 求 封 锁R ,T 3 释放R 上 的 锁 后 , 系 统 又 批 准 了 T 4 的请 求 , ,T 2 有可能就这样永远 等待下 去 。 41 数据库原理与应用 2 6.2.3 封 锁 出 现 的 问 题 及 解 决 方 法 42 数据库原理与应用 T 1 T 2t 1Xlock A t 2Xlock B t 3Xlock B 等待 t 4Xlock A 等待 6-9 6.2.3 封 锁 出
12、 现 的 问 题 及 解 决 方 法 43 数据库原理与应用 3. 1 1) 一次封锁法 。 2) 顺序封锁法 。 2 6.2.3 封锁出现的问题及解决方法 44 数据库原理与应用 1 1 6.2.3 封 锁 出 现 的 问 题 及 解 决 方 法 45 数据库原理与应用 1 2 例如,规定数据对象的封锁顺序为A 、B 、C 、D 、 E。事 务T起初封锁数据对象B 、C 、E,但后来发 现还需要封锁A,这就破坏了封锁顺序。 6.2.3 封锁出现的问题及解决方法 46 数据库原理与应用 2 6.2.3 封 锁 出 现 的 问 题 及 解 决 方 法 47 数据库原理与应用 6.2.4 可串行化
13、调度 48 数据库原理与应用 例如:事务1的封锁顺序遵守两段锁协议: SlockA SlockB XlockC UnlockB UnlockA UnlockC 事务2的封锁顺序破坏了两段锁协议: SlockA UnlockA SlockB XlockC UnlockC UnlockB 6.2.4 可串行化调度 49 数据库原理与应用 Oracle Oracle Commit Rollback 6.2.5 ORACLE的并发控制机制 50 数据库原理与应用 Oracle DML Oracle 的数据锁有5种:共享锁(S锁)、排 它锁(X锁),行级共享锁(RS锁)、行级 排它锁(RX锁)和共享行级
14、排它锁(SRX 锁),其封锁粒度包括行级和 表级 。 6.2.5 ORACLE的并发控制机制 51 数据库原理与应用 6.2.5 ORACLE的并发控制机制 Oracle LOCK TABLE Oracle SELECT : LOCK TABLE IN : COMMIT ROLLBACK 52 数据库原理与应用 6.2.5 ORACLE的并发控制机制 (S ) LOCK TABLE IN SHARE MODE 当一事务在表级上获得共享锁,则允许其他事务 在该表上做查询、用 封锁指定行或执行S 、RS封锁。禁止其他事务执 行X 、RX封锁。 当一表上有多个事务持S锁,则事务在该表上不 能执行插入、修改或删除操作。