第11章 并发控制
事务
事务:(从微观角度,或者从DBMS角度)是数据库管理系统提供的控制数 据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合 在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性 状态转换的保证。
事务一般是由应用程序员提出,因此有开始和结束, 结束前需要提交或撤消。
Begin Transaction
exec sql …
…
exec sql …
exec sql commit work | exec sql rollback work
End Transaction
在嵌入式SQL程序中,任何一条数据库操纵语句(如exec sql select等)都会引发一个新事务的开 始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过commit或 rollback确认的。因此Begin Transaction 和End Transaction两行语句是不需要的。
- 事务的宏观性(应用程序员看到的事务): 一个存取或改变数据库内容的程 序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务
- 事务的微观性(DBMS看到的事务): 对数据库的一系列基本操作(读、写) 的一个整体性执行。
事务的并发执行:多个事务从宏观上看是并行执行的,但其微观上的 基本操作(读、写)则可以是交叉执行的。
事务的特性 ACID
- 原子性Atomicity : DBMS能够保证事务的一组更新操作是原子不可分的,即 对DB而言,要么全做,要么全不做
- 一致性Consistency: DBMS保证事务的操作状态是正确的(符合一个串性的调度),符合一致性的操 作规则,它是进一步由隔离性来保证的
- 隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如两 个事务T1和T2, 即使并发执行,也相当于或者先执行了T1,再执行T2;或者先执行 了T2, 再执行T1。
- 持久性Durability: DBMS保证已提交事务的影响是持久的(影响磁盘),被撤销事务的影 响是可恢复的(不影响磁盘)。
事务的并发可能导致
-
丢失修改
由于并发交替执行的操作,可能导致某一事物的修改被覆盖
-
不能重复读:
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
在一个事务过程中,由于另一个事务修改数据,造成该事务前后读取数据不一致
-
幻读:
幻读指的是事务不是串行 发生时的一种现象,是事务 A读取了事务B已提交的新 增数据。例如第一个事务对 一个表的所有数据进行修 改,同时第二个事务向表中 插入一条新数据。那么操作 第一个事务的用户就发现表 中还有没有修改的数据行, 就像发生了幻觉一样。解决 幻读的方法是增加范围锁 (range lock)或者表锁。
在一个事务过程中,由于另一个事务插入或删除记录,造成该事务前后读取总的记录数不一致
-
脏读:
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
一个事务读取了另一个事务尚未提交的数据
数据库事务隔离级别(脏读、幻读、不可重复读)_qq_41776884的博客-CSDN博客_幻读脏读不可重复读
DBMS对事物的控制
事务的调度
事务调度(schedule):一组事务的基本步(读、写、其他控 制操作如加锁、解锁等)的一种执行顺序称为对这组事务的一个调度。
并发(或并行)调度:多个事务从宏观上看是并行执行的,但其微观上的基本 操作(读、写)则是交叉执行的。
面试必考的:并发和并行有什么区别? - 云+社区 - 腾讯云 (tencent.com)
并发相互抢占资源,并行不相互抢占资源
并发调度的正确性
当且仅当在这个并发调度下所得到的新数据库结果与 分别串行地运行这些事务所得的新数据库完全一致,则说调度是正确的。
可串行性:
如果不管数据库初始状态如何,一个调度对数据 库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的 (Serializable)或具有可串行性(Serializability)
并行调度的正确性是指内容上结果正确性,而可串行性是指形式上结果正 确性;
可串行性更严格
不可串性化的调度可能产生正确的结果
表达事务的一种模型
冲突可串行性
冲突可串行性: 一个调度,如果通过交换相邻两个无冲突的操作能够 转换到某一个串行的调度,则称此调度为冲突可串行化的调度。
冲突可串行性 是比 可串行性 要严格的概念
满足冲突可串行性,一定满足可串行性;反之不然。
锁
封锁协议之锁的类型
-
排他锁X (exclusivelocks)
只有一个事务能读、写,其他任何事务都不能读、写
-
共享锁S (sharedlocks)
所有事务都可以读,但任何事务都不能写
-
更新锁U (Updatelocks)
初始读,以后可升级为写
-
增量锁I (Incrementallock)
增量更新(例如A=A+x) 区分增量更新和其他类型的更新
隔离
MySQL默认的隔离级别是可重复读
封锁粒度
两段锁协议
两段封锁协议是可以保证冲突可串行性的!