为什么要进行并发控制
- 为什么要进行并发控制——数据库可能存在不一致
- 三种典型的不一致现象
(1)丢失修改
(2)不能重复读
(3)脏读
- 并发控制及相应的事务处理技术是DBMS的核心技术
什么是事务
-
事务:数据库管理系统提供的控制数据操作的一种手段,保证数据库的正确性、一致性
-
事务的宏观性:一个存取或改变数据库内容的程序的一次执行,或着说一条或多条SQL语句被看成一个事务
事务一般由程序员提出,因此有开始和结束,结束需要提交或撤销 -
一个事务可以处理一个或一条记录
一段程序语句可能会循环执行,执行中SQL语句引出事务,到commit/RollBack结束事务,每次重复都将产生一个事务。 -
事务的微观性:对于数据库的一系列基本操作的一个整体性执行
-
事务的并发执行
并发、交错的事务引发不一致性 -
事务的特性:ACID
A:原子性,保证事务的一组更新操作原子不可分
C:一致性,保证事务的操作状态是正确的
I:隔离性,并发执行的多个事务之间不受影响
D:持久性,已提交事务不丢失,被撤销事务可恢复 -
DBMS对事务的控制
事务调度与可串行性
- 事务调度:一组事物的基本步(读、写、其他控制)的一种执行顺序称为对这组事务的一个调度。
- 并发调度:多个事务从宏观上看是并发执行的
- 并发调度的正确性
- 可串行性:衡量并发调度正确性
- 冲突:调度中一对连续的动作,满足如果顺序交换,那么涉及的事务中至少有一个事务的行为会改变
- 集中冲突情况:
(1)同一事务中任何两个操作都是冲突的
(2)不同事务对同一元素的写操作是冲突的
(3)不同事务对同一元素的一读,一写操作是冲突的 - 冲突可串行性
一个调度,如果交换两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度。 - 冲突可串行性是比可串行性严格的概念
满足冲突可串行性一定满足可串行性,反之不成立
冲突可串行性判别算法
- 并发调度的正确性
- 冲突可串行性判别算法
(1)构造一个前驱图(有向图),如果这个有向图没有环,冲突是可串行化的
什么是锁
- 锁是控制并发的一种手段
(1)每一数据元素都有唯一的锁
(2)每一事务读写数据元素前,要获得锁
(3)如果被其他事务持有该元素的锁,则需要等待
(4)事务处理完成后要释放锁
Li(A):事务Ti对数据元素A加锁
Ui(A):事务Ti对数据元素A解锁
- 锁表
必须解锁后才能枷锁
封锁协议需要考虑什么
- 锁的类型:
(1)排他型锁X:只有一个事务能读、写
(2)共享型锁S:所有事务都可以读,但任何事务都不能写
(3)更新锁U:初始读,后可升级为写
(4)增量锁I:增量更新(A=A+X) - 封锁协议之相容性矩阵:
(1)读写锁协议:
(2)更新锁协议 - 加锁/解锁时机
3级协议:降低了并发度
-
SQL之隔离性级别
所有的都不允许有丢失修改 -
幻读:
-
封锁粒度
两段封锁协议
- 两端封锁协议:读写数据之前要获得锁,每个事务中所有的封锁请求先于任何一个解锁请求。