本文内容系2024年北航软件学院数据管理技术课程课堂笔记,内容大部分取自课程PPT,少量来源于互联网,若有侵权请联系删除。文章内容如有错漏,敬请批评指正!
第八章 并发控制
10 - 事务管理
8.1 并发控制
数据资源共享,为了充分利用数据库资源,数据库用户对数据库系统并行存取数据
数据库的一致性:在任何时刻用户面对的数据库都是符合现实世界的语义逻辑的
- 多个用户并发存取同一数据块时,如果对并发操作不加控制可能会产生不正确的数据,破坏数据的一致性
- DBMS必须对并发操作进行控制,避免破坏数据一致性
- 数据库并发控制以事务为基本单位进行,对事务所操作的数据施加封锁来实现一致性
- 这种数据一致性约束属于动态关系约束
8.2 事务(Transaction)
事务:用户定义的一个数据库操作序列,是不可分割的工作单位(要么全做,要么全不做)
事务和程序是两个概念:
- 一个事务可以是一条或一组连续的SQL语句
- 一个对数据库进行操作的应用程序可以包含多个事务,这些事务是串行的
事务开始与结束可由用户显式控制,若用户未显示定义,则由DBMS按照缺省规定自动划分事务
用户自定义的事务:以Begin transaction
开始,以Commit
或Rollback
结束。
commit
:事务的提交,将事务中所有对数据库的更新写回磁盘上的物理数据库中,此时事务正常结束rollback
:事务的回滚,即事务运行过程中发生故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,再回滚到事务开始时的状态
例:事务开始 -> 系统在A账户删除100元 -> 系统在B账户增加100元 -> 事务结束
BEGIN TRANSACTION
READ A
A = A - 100
IF A < 0 THEN /* A款不足 */
BEGIN
DISPLAY "A款不足"
ROLLBACK
END
ELSE /* 拨款 */
BEGIN
READ B
B = B + 100
DISPLAY "拨款完成"
COMMIT
END
事务:并发控制的基本单位,遇到数据库错误后进行数据恢复的处理单位
事务由有限的数据库操作序列组成,但并非任意数据库操作序列都能成为事务,需要有如下4个特征。
8.2.1 ACID特征
原子性(Atomicity)
- 事务中包含的所有操作要么全做,要么全不做
- 系统应保证只执行了一部分的事务不会对数据库状态产生影响(钱打了一半出现错误,账户钱不能少)
隔离性(Isolation)
- 并发执行的各个事务之间不能互相干扰
- 一个事务内部的操作及使用的数据对其他并发事务是隔离的
- 每个事务在执行的时候应感觉不到其他事务的存在
一致性(Consistency)
- 是原子性和隔离性的结果
- 数据库在事务执行前是一致的,执行过程中可能暂时出现不一致,而当事务执行完后,数据库仍会处于一致性状态
持久性(Durability)
- 一个事务一旦提交(commit)之后,它对数据库的影响必须是永久的。系统发生失效不能改变事务的持久性。
8.2.2 事务的状态
数据库的恢复机制保证了原子性和持久性的实现
-
一种简单的恢复机制: shadow-database影子数据库技术
-
假定同时只有一个事务是活动的(不存在隔离性问题)
-
对数据库的更新都在影子数据库上进行。当事务更新都完成后,数据库指针
db-pointer
指向影子数据库,将之变成当前数据库。若事务出现错误,则删除影子数据库
-
-
恢复机制不能解决事务并发执行情况下的数据一致性、隔离性问题
8.2.3 事务的并发执行
-
当同一数据库系统中有多个事务并发运行时,如果不加以适当控制,可能会破坏事务的隔离性,产生数据的不一致性。
-
并发操作带来的数据一致性——丢失修改、不可重复读、读脏数据
-
优点:
- 提高系统吞吐量
- 减少平均响应时间
1. 丢失修改(lost update)——写写冲突
-
事务1与事务2从数据库中读入同一数据并修改,事务2的提交结果破坏了事务1提交的结果,导致事务1的修改被丢失。也称脏写(dirty write)——写写冲突
T 1 T_1 T1 T 2 T_2 T2 读 A = 16 A=16 A=16 读 A = 16 A=16 A=16 A = A − 1 A = A - 1 A=A−1;写 A = 15 A=15 A=15 A = A − 1 A = A - 1 A=A−1;写 A = 15 A=15 A=15
2. 不可重复读(non-repeatable read)——读写冲突
-
指事务1读取数据后,事务2执行更新操作,使事务1无法再现前一次读取结果。
-
三种情况:事务1读取某一数据后,
-
事务2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。
-