深入认识事务
事务定义
(宏观角度:应用程序员)一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句一次执行被看作一个事务。事务是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。
(微观角度:DBMS)对数据库的一系列基本操作(读,写)的一个整体性执行。
事务的并发执行
多个事务从宏观上看是并行执行的,但其微观上的基本操作(读,写)则可以是交叉执行的。
事务特性ACID
原子性Atomicity: DBMS能够保证事务的一组更新操作是原子不可分的,即对数据库而言,要么全做,要么不做。
一致性Consistency: DBMS保证事务的操作状态是正确的,符合一致性的操作规则,不能出现三种典型的不一致性,它是进一步由隔离性来保证的。
隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如,两个事务T1和T2,即使是并发执行,也相当于先执行T1再执行T2 或者反之。
持久性Durability: DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。
事务结合其特性的理解
具有ACID特性的若干数据库基本操作的组合体被称为事务。
事务调度与可串行性
事务调度
一组事务的基本步(读 ,写,其他控制操作如加锁,解锁等)的一种执行顺序称为对这组事务的一个调度。
并发(并行)调度
多个事务从宏观上看是并行执行的,但其微观上的基本操作(读,写)则是交叉执行的。
并发调度的正确性
当且仅当在这个并发调度下所得到的新数据库结果与分别串行地运行这些事务所得到的新数据库完全一致,则说明调度是正确的。
可串行性
如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,则我们说这个调度是可串行化的或是具有可串行性的。
注意:
- 可串行化调度一定是正确的并行调度,但正确的并行调度,却未必是可串行化的调度。
- 并行调度的正确性是指内容上结果正确性,而可串行性是指形式上结果正确性,便于操作。
- 可串行化的等效串行序列不一定唯一。
冲突
调度中一对连续的动作,如果它们的顺序交换,那么涉及的事务中至少有一个事务的行为会改变。
有冲突的两个操作是不能交换次序的,没有冲突的两个事务是可交换的。
几种冲突的情况
- 同一个事务的任何两个操作都是冲突的
- ‘不同事务对同一元素的两个写操作是冲突的
- 不同事务对同一元素的一读一写操作是冲突的
冲突可串行性
一个调度,如果通过交换相邻两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度。
注意:
- 冲突可串行性是比可串行性要严格的概念
- 满足冲突可串行性,一定满足可串行性;反之不然
基于封锁的并发控制
锁的概念
锁是控制并发的一种手段,是数据库元素上的并发控制标志
关于锁的基本知识点
- 每一数据元素都有唯一的锁
- 每一事务读写数据元素前,要获得锁
- 如果被其他事务持有该元素的锁,则要等待
- 事务处理完成后要释放锁
- 锁本身并不能保证冲突可串行性,只是为调度提供了控制的手段,具体如何使用锁需要说明——不同协议
封锁协议之锁的类型
排他锁X
只有一个事务能读和写,其他任何事务都不能读、写
共享锁S
所有事务都可以读,但任何事务都不能写
更新锁U
初始读,以后可以升级为写
增量锁I
区分增量更新和其他类型的更新
封锁协议0级到3级协议(加锁的时机)
SQL之隔离性级别
对应封锁协议0级到3级协议
注意: 所有的并发控制都不允许有丢失修改。
封锁协议之封锁粒度
- 封锁粒度是指封锁数据对象的大小。
- 粒度单位:属性值——>元祖——>元祖集合——>整个关系——>整个DB索引项——>整个索引
- 由前往后:并发度小,封锁开销小
- 由后往前:并发读大,封锁开销也大
两段封锁协议
定义
是一种基于锁的并发控制方法。读写数据之前,每个事务中所有封锁请求先于任何一个解锁请求。两阶段:加锁段和解锁段。加锁段不能有解锁操作,解锁段不能有加锁操作。
作用
两段封锁协议是可以保证冲突可串行性的。
注意:两段封锁协议是可能产生死锁的协议