数据库原理之事务管理

UNIT 10 事务管理
12
学完本讲后,你应该能够了解:
1、事务是数据库操作的原子单位,具有原子性、一致性、隔离性
和持久性等特性;
2、事务的并发导致的四种不一致性:丢失修改、不可重复读、读
“脏”数据和幻像.
3、并发控制的目标是保证事务的隔离性,从而保证数据库的一致
4、并发控制的正确性准则是事务并发执行的可串行化
5、三级封锁协议和两段锁协议的工作原理;
6、数据库恢复的目标是在故障发生时,确保事务的原子性和持久性;
7、DBMS提供备份机制、日志机制、检查点机制来协助数据库故
障恢复;一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
31、为什么要引入事务?
例:银行转帐:从帐号A中取出一万元,存入帐号B。
u 第一个操作是从帐号A中减去一万元,第二个操作
是向帐号B中加入一万元
u 这两个操作要么全做,要么全不做如果只做一个
操作则用户逻辑上就会发生错误,少了一万元,
45
1、为什么要引入事务?
例:假定数据库系统自动检测参照完整性约束,有下面操作:
操作一:删除学号为“95002”的学生的信息;
操作二:插入选课信息(“95005” , “C8” ,85);
操作三:修改学号“95001”的学生的学号为“95008”;
这些操作
如何实现?
这些操作
一定能用
SQL实现吗?
回想一下Unit 8中这个例子的讲述。6
为何出
现该问
题?
Ø 参照完整性的检测时机
是在关系数据库的原子操作
之前或之后
Ø 一个SQL语句是关系数据
库的原子操作;
如何解
决该问
题?
修改原子操作的定义 ——
可以将多个SQL语句定义为
一个原子操作
事务7
2、事务的概念(
P160)
l 事务
----是数据库的逻辑工作单位。是用户定义的一个
数据库操作序列。这些操作要么全做要么全不做,是
一个不可分割的工作单位。
l 事务是数据库并发控制和恢复的基本单位。
为什么数据
库需要事务
这个概念?
保证数据
库状态的
一致性
数据库系统与
操作系统的基
本单位不同3、定义事务的两种方式
l 显式方式
• 事务的开始由用户显式控制或DBMS自动隐含
• 事务结束由用户显式控制
BEGIN TRANSACTION
COMMIT
ROLLBACK
l 隐式方式
当用户没有显式地定义事务时,由DBMS按缺省规
定自动划分事务
89
u 事务开始
u BEGIN TRANSACTION
u 事务结束
u ROLLBACK
u事务异常终止,回滚事务的所有操作.
u在事务运行的过程中发生了某种故障,事务不
能继续执行.系统将事务中对数据库的所有已
完成的更新操作全部撤消,滚回到事务开始时
的状态
u COMMIT
u事务正常结束 ,提交事务的所有操作
u使事务中所有对数据库的更新永久生效(保存
在物理数据库中)。10
4、事务的特性—— ACID特性(
P160)
Ø
原子性(
Atomicity)
事务包含的一组更新操作是原子不可分的,
即更新操作对于数据库而言,要么全做,要
么全不做,不能部分地完成
Ø
一致性(
Consistency)
事务执行的结果必须使数据库从一个一致性
状态变到另一个一致性状态。11
Ø
隔离性(
Isolation)
一个事务的执行不能被其它事务干扰。即一
个事务的内部操作及使用的数据对其它并发
事务是隔离的,不可见的。
Ø
持久性(
Durability)
事务一旦提交,它对数据库中数据的改变就
是永久性的,即使随后系统发生故障也能保
持或恢复。12
破坏事务ACID特性的因素有:
1)多个事务的并发运行
2)事务的运行过程中被强行停止
并发控制
故障恢复13
并发带来的不一致性的例子
例:假定两个顾客使用主副信用卡分别几乎同时刻在两
台ATM上取款;
有可能两人
各取出500元,
而帐户上只
减少500元。
导致此种情
形出现的原
因是什么?一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
1415
1、并发控制
为了有效地利用系统资源,发挥数据库共享资源
的特点,即使是在集中式数据库系统中,多个事务
也进行并发(
concurrency)。
事物的隔离性要求事务内部的操作及数据的使用
对并发的其它事务是隔离的。
由于操作系统的基本操作单位——进程,与数据
库系统的基本操作单位——事务不同,DBMS需要对
事务进行并发控制,以保证数据库中数据的一致性。
(参见教材P160-162)16
DBMS
DB
T1 T2 T3
并发控制的目标
是什么?
事务的并发操作何时
会破坏事务的隔离性?
会出现哪些
不一致性?
保证事务的隔离性,
从而保证数据库的一致性
事务操作相同的数据并且
这些操作是冲突的17
Write X
2、事务并发导致的不一致性
例:两个事务T1和T2读入同一数据并修改
丢失修改
T2
T1
Read X
(10)
Read X
(10)
Compute X+=10
(20
Compute X+=15
(25)
Write X18
例:事务T2读取数据X后,事务T1更新该数据X,T2
再读X时,得到的结果不同
不可重复读
T2
T1
Read X
(10)
Read X
(10)
Compute X+=15
(25)
X=25
Write X
Commit
Read X
(25)
X=1019
例:事务T1修改数据X,事务T2读取X后,T1被撤消,
并将X恢复原值,T2读到的值与数据库不一致
读“脏”数据
T2
T1
X=10
Read X
(25)
Read X
(10)
Compute
X+=15
(25)
X=25
Write X
X=10
Rollback
Use value of
X that was never
committed to DB20
例:事务T1按一定条件读数据库后,事务T2删除或
插入了某些记录,当事务T1再次按相同条件读
数据库时,发现某些记录神秘消失或出现,
幻像
T2
T1
Time
Select count (*)
where rank > 3
2 rows returned
Select count (*)
where rank > 3
3 rows returned21
总结:事务并发导致的四个不一致性
l 丢失修改(
Lost Update)
l 不可重复读(
Non-Repeatable Read)
l 读“脏”数据(
Dirty Read)
l 幻像(
Phantom)3、出现不一致性的原因
不同事务间冲突操作的无序执行。
如何控制冲突
操作的无序?
2223
4、并发控制的方法
DBMS
DB
T1 T2 T3
两种途径:
l 对共享的资源
DB进行控制
-- 加锁
l 对事务规定
一定的顺序
-- 时间戳一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
2425
1、封锁的定义 (
P163)
所谓封锁就是事务T在对某个数据对象例
如表、记录等操作之前,先向系统发出请求,
对其加锁。加锁后事务T就对该数据对象有
了一定的控制,在事务T释放它的锁之前,
其他事务对该数据的操作受到一定限制。26
2、基本的封锁类型
l 排它锁(
Exclusive Locks,简称X锁,也称写锁)
l 共享锁(
Share Locks,简称S锁,也称读锁)
封锁类型的相容矩阵:
T1 T2
X
S
-
X
N
N
Y
S
N
Y
Y
-
Y
Y
Y
N=No,不相容
Y=Yes,相容3.封锁协议包含的内容
l 什么操作需要申请何种锁?
---- 排它锁、共享锁
l 何时加锁?
---- 事务开始前、操作开始前
l 何时解锁?
---- 操作结束后、事务结束前
2728
T1
T2
1)读A=16
2)
读A=16
AA2
写回A=32
3)读A=32
T1
T2
1)读A=16
AA2
写回A=32
2)
读A=32
3)ROLLBACK
A恢复为16
T1
T2
1)读A=16
2)
读A=16
3)AA–1
写回A=15
4)
AA–1
写回A=15
丢失修改
不可重复读
读“脏”数据
以下用的三种数据不一致问题的例子:29
4.一级封锁协议
一级封锁协议:事务T在修改数据R之前必须先对
其加X锁,直到事务结束才释放。事务结束包括正常
结束(
COMMIT)和非正常结束(
ROLLBACK)。30
一级封锁协议功能
可防止丢失修改,并保证事务T是可恢复的
T1
T2
1)读A=16
2)
读A=16
AA2
写回A=32
3)读A=32
T1
T2
1)读A=16
AA2
写回A=32
2)
读A=32
3)ROLLBACK
A恢复为16
丢失修改
不可重复读
读“脏”数据
T1
T2
1)读A=16
2)AA–1
写回A=15
申请A的X
锁,等待
3)
读A=15
4)
AA–1
写回A=14
T1
T2
① Xlock A
获得
② 读A=16
③A←A-1
写回A=15
Commit
Unlock A
Xlock A
等待
等待
等待
等待
获得Xlock A
读A=15
A←A-1
写回A=14
Commit
Unlock A
图5-8 没有丢失修改32
5.二级封锁协议
二级封锁协议:一级封锁协议加上事务T
在读取数据R之前必须先对其加S锁,读完后即
可释放S锁。33
二级封锁协议功能
除了防止丢失修改,还可进一步防止读“脏”数据
T1
T2
1)读A=16
2)
读A=16
AA2
写回A=32
3)读A=32
T1
T2
1)读A=16
AA2
写回A=32
2)
申请A的S
锁,等待
3)ROLLBAC
K
A恢复为16
丢失修改
不可重复读
读“脏”数据
T1
T2
1)读A=16
2)AA–1
写回A=15
申请A的X
锁,等待
3)
读A=15
4)
AA–1
写回A=14
6.三级封锁协议
三级封锁协议:一级封锁协议加上事务T
在读取数据R之前必须先对其加S锁,直到事
务结束才释放。
3435
三级封锁协议功能
除了防止丢失修改和防止读“脏”数据外,还
防止了不可重复读
T1
T2
1)读A=16
2)
申请A的X
锁,等待
3)读A=16
T1
T2
1)读A=16
AA2
写回A=32
2)
申请A的X
锁,等待
3)ROLLBACK
A恢复为16
丢失修改
不可重复读
读“脏”数据
T1
T2
1)读A=16
2)AA–1
写回A=15
申请A的X
锁,等待
3)
读A=15
4)
AA–1
写回A=1436
7.一、二、三级封锁协议的一致性保证
(见教材P166)
X 锁
S 锁
一 致性 保证
操作结
束释放
事务结
束释放
操作结
束释放
事务结
束释放
不丢失
修改
不读
“脏”
数据
可重复
一级封锁协议
二级封锁协议
三级封锁协议
一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
3738
1. 并发调度的可串行性
系统对并发事务
中并发操作的调
度是随机的,哪
个(些)调度是
正确的?
能将数据库置于
一致状态的调度
将所有事务串
行起来的调度
策略一定是正
确的调度
与串行调度等价的
调度是正确的调度 并发事务正确性准则 ---- 多个事务的并发执行是
正确的,当且仅当其结果与某一次序串行地执行它们时
的结果相同,我们称这种调度策略为可串行化的调度。
例如,现在有两个事务T1和T2:
事务T1 :读B;A=B+1;写回A;
事务T2 :读A;B=A+1;写回B;
假定A,B的初值均为2,则
按T1T2次序执行结果为A=3,B=4;
按T2T1次序执行结果为A=4,B=3;
3940
T1
T2
Slock B
Y=B=2
Unlock B
Xlock A
A=Y+1
写回A(=3)
Unlock A
Slock A
X=A=3
Unlock A
Xlock B
B=X+1
写回B(=4)
Unlock B
T1
T2
Slock A
X=A=2
Unlock A
Xlock B
B=X+1
写回B(=3)
Unlock B
Slock B
Y=B=3
Unlock B
Xlock A
A=Y+1
写回A(=4)
Unlock A
T1
T2
Slock B
Y=B=2
Slock A
X=A=2
Unlock B
Unlock A
Xlock A
A=Y+1
写回A(=3)
Xlock B
B=X+1
写回B(=3)
Unlock A
Unlock B
T1
T2
Slock B
Y=B=2
Unlock B
Xlock A
Slock A
A=Y+1
等待
写回A(=3) 等待
Unlock A 等待
X=A=3
Unlock A
Xlock B
B=X+1
写回B(=4)
Unlock B
串行调度
串行调度
不可串行化调度
可串行化调度什么样的方
法能保证调
度的可串行
化?
两段锁
协议
412.两段锁协议
所谓两段锁协议是指所有事务必须分两个
阶段对数据项加锁和解锁。
l 在对任何数据进行读、写操作之前,首
先要申请并获得对该数据的封锁;
l 在释放一个封锁之后,事务不再申请和
获得任何其他封锁。
“两段” ---- 获得(扩展)阶段和释
放(收缩)阶段
42两段锁协议示例
4344
l 两段锁协议是可串行化的充分条件,而不是必要
条件
例:P167 图5011
l 两段锁协议可能导致死锁
T1
T2
Slock B
读B=2
Slock A
读A=2
Xlock A
等待
Xlock B
等待
等待
例:一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
4546
封锁的方法可能引起活锁和死锁等问题
1、
活锁(见教材P167-169)
如果事务T1封锁了数据R,事务T2又申请封锁R,
于是T2等待。T3也请求封锁R,当T1释放了R上的封锁
之后系统首先批准了T3的请求,T2仍然等待。然后T4
又申请封锁R,当T3释放了R上的封锁之后系统又批准
了T4的请求……T2有可能永远等待。
如何解
决活锁?
先来先
服务47
2、死锁
Ø
死锁的定义
如果事务T1封锁了数据R1,事务T2封锁了R2,
然后,T1请求封锁R2,等待。接着T2请求封锁R1,
等待。这样就出现了T1等待T2,而T2又在等待T1的
局面。这两个事务永远不能结束,形成死锁。
如何解决
死锁?
预防
诊断与
解除48
Ø
死锁的诊断与解除
诊断:
l 超时法
-- 超过规定的时间就认为发生死锁
不足:可能误判死锁,也可能不能及时发现死
l 等待图法
-- 事务为结点,边表示事务等待的情况,若T1
等待T2,则T1T2。系统周期性地检测事务等待
图,若图中存在回路,则出现死锁。
解除:
选择一个处理死锁代价最小的事务,撤消。一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
4950
1. 封锁的粒度
(见教材P164)
整个数据库
关系
元组
索引51
2. 封锁粒度的选择
封锁粒度与系统的并发度和并发控制的
开销密切相关。
封锁粒度越大
并发度越小
系统开销越小
选择封锁粒度时应该同时考虑并发度和开销两个因素
不同的事
务选择不
同的封锁
粒度—多
粒度封锁52
3. 多粒度封锁
---- 在一个系统中同时支持多种封锁粒度供不
同的事务选择。
多粒度封锁协议允许多粒度树中的每个结点被
独立地加锁。对每个结点的加锁意味着这个结点的
所有后裔结点也被加以同样类型的锁。
l 显式封锁
-- 应事务的要求直接加到数据对象上的封锁
l 隐式封锁
-- 该数据对象没有独立加锁,是由于其上
级结点加锁而使该数据对象加上了锁53
判断能否对一个数据对象加锁:
1)检查该数据对象有无显式封锁与之冲突;
2)检查其所有上级结点,看本事务的显式封锁
是否与该数据对象上的隐式封锁冲突;
3)检查其所有下级结点,看上面的显式封锁是
否与本事务的隐式封锁冲突。 4. 意向锁(为了减少对子孙节点加锁情况的搜索,
引入意向锁
---- 如果对一个结点加意向锁,则说明该结点的下
层结点正在被加锁;对任一结点加锁时,必须先对它的
上层结点加意向锁。
l 意向共享锁(简称IS锁)
-- 如果对数据对象加IS锁,表示它的后裔结点拟加S锁
l 意向排它锁(简称IX锁)
-- 如果对数据对象加IX锁,表示它的后裔结点拟加X锁
l 共享意向排它锁(简称SIX锁)
-- 如果对数据对象加SIX锁,表示先加S锁,再加IX
54意向锁图示:
55意向锁图示:
T4: Locks table in “X” mode
T3: Locks row in “X” mode
56一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
571、隔离级别
u 事务的隔离性:事务在并发执行时应该相
互独立互不干扰。
• 隔离性与并发性能是一对矛盾,在实践中有时
候会放松隔离性的要求,通过“隔离性级别”
来权衡事务的隔离性和并发能力。
u 事务的隔离性级别:又称事务的一致性级
别,是一个事务必须与其它事务实现隔离
的程度,是事务可接受的数据不一致程度。
5859
SQL-92 定义了下列四种隔离级别(
SQL Server支持
所有这些隔离级别):
◆未提交读(事务隔离的最低级别,仅可保证不读
取物理损坏的数据)
◆提交读(
SQL Server 默认级别)
◆可重复读
◆可串行读(事务隔离的最高级别,事务之间完全
隔离)。6061
2、隔离级别允许不同类型的行为
隔离级别
脏读
不可重复读取 幻像
未提交读
提交读
可重复读
可串行读
丢失修改
否3、SQL Server设置隔离级别
SET TRANSACTION ISOLATION LEVEL
语法:
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
62一 .事务的定义与特性
二.事务并发导致的四种不一致性
三.封锁及封锁协议
四.可串行性与两段锁协议
五.封锁导致的问题—活锁与死锁
六. 封锁粒度
七. 隔离级别
八. 数据库恢复的技术
6364
1、数据库恢复的目标
---- 把数据库从错误状态恢复到某一个已知的
正确状态(亦称为一致状态或完整状态)的功能。
数据库恢复的目标是在故障发生时,确保事务的
原子性和持久性
何时需要对数
据库进行恢复?
故障
数据库恢复
有何特点?
(见教材P169-178)65
2、数据库恢复的特点
DBMS
DB
应用程序
应用程序
OS
缓冲区
因为DB与内存用户工作区
之间的数据交换是通过缓
冲区进行的,而这个交换
一般是以缓冲区是否满来
触发的。因此,有可能提
交事务的数据仍在缓冲区
而没有写到DB中,而未提
交事务的数据却写到了DB
中。所以,故障恢复时,
可能既要REDO已经提交了
的事务,又要UNDO未提交
的事务,以保证事务的原
子性66
3、数据库恢复的基本原理
数据库恢复就是利用存储在系统其他地方的冗
余数据来修复数据库中被破坏的或不正确的数据
如何建立冗
余数据?
如何利用这
些冗余数据
实施数据库
恢复?
恢复的实现技术
恢复的实现策略4、建立冗余数据最常用的技术
◆ 数据转储
---- 即DBA定期地将整个数据库复制到磁带
或另一个磁盘上保存起来的过程。这些备用
的数据文本称为后备副本或后援副本。
◆登记日志文件
---- 是用来记录事务对数据库的更新操作
的文件。
6768
5、登记日志文件
l 内容
Ø 各个事务的开始标志(
BEGIN TRANSACTION)
Ø 各个事务的结束标志(
COMMIT 或 ROLLBACK)
Ø 各个事务的所有更新操作
l 格式
事务标识
操作类型
操作对象
旧值
新值
T1
BEGIN
T2
INSERT
X
NULL
2
T1
UPDATE
Y
5
7
T1
DELETE
Z
abc
NULL
T1
COMMIT69
6、系统故障的恢复实现策略
系统故障导致的数据库不一致
1)未完成的事务对DB产生影响
2)已完成的事务在缓冲区的内容未写入DB
恢复功能
1)UNDO未完成的事务
2)REDO已完成的事务
恢复步骤
1)正向扫描日志文件,建立UNDO和REDO队列;
2)反向扫描日志文件,对每个UNDO事务的更新执行逆操作;
3)正向扫描日志文件,对每个REDO事务的更新重新执行。
需要REDO日
志中所有已
完成的事务
吗?是否一
部分故障发
生点前很久
的事务不需
要REDO?如
何确定这些
事务?
由此引
入了检
查点恢
复技术70
7、检查点技术
检查点(
checkpoint)是使物理数据文件与数
据库高速缓存当前状态同步的一种操作,方法是将所
有高速缓存中的被修改的数据页写回到磁盘,这确保
了对数据的一份永久拷贝(在磁盘上)。
检查点将最小化必须REDO的事务数量。7172
学完本讲后,你应该能够了解:
1、事务是数据库操作的原子单位,具有原子性、一致性、隔离性
和持久性等特性;
2、事务的并发导致的四种不一致性:丢失修改、不可重复读、读
“脏”数据和幻像.
3、并发控制的目标是保证事务的隔离性,从而保证数据库的一致
4、并发控制的正确性准则是事务并发执行的可串行化
5、三级封锁协议和两段锁协议的工作原理;
6、数据库恢复的目标是在故障发生时,确保事务的原子性和持久性;
7、DBMS提供备份机制、日志机制、检查点机制来协助数据库故
障恢复;1、单个SQL语句与操作系统的原子操作相比,哪个
操作单位大?
2、如果数据库系统不能保证单个SQL语句的原子性,
数据库的更新操作会导致数据库的不一致性吗?
3、如果数据库不能保证事务操作的原子性,数据库
的更新操作会导致数据库的不一致性吗?
73教材:《数据库系统原理教程》(第2版)
P178
8、9、10、11、12、13、14、16、17
74
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值