7.1事务
1.事务通常以begin transaction开始,以commit或者rollback结束
commit:表示提交。提交事务的所有操作,将事务中的多有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
rollback:表示回滚,在事务运行的过程中如果发生了某种故障,事务不能继续执行,系统将事务中对数据库的已完成的更新操作全部撤销,回滚到事务开始的状态
2.事务的特性:
①原子性:是指事务是数据库的逻辑工作单位,事务中的操作要么都做,要么都不做
②一致性:是指事务执行的结果必须是使数据库从一个一致性状态转到另一个一致性状态
③隔离性:是指数据库中一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行的各个事务不能互相干扰
④持久性:是指事务一旦提交,则其对数据库中数据的改变就是永久的,以后的操作或故障不会对事务的操作结果产生任何影响
以上特性被称为ACID特性,事务是数据库并发控制和恢复的基本单位。
7.2并发控制
1.认识并发控制
事务可以一个一个的串行执行,每个时刻只有一个事务在执行,其他事务必须等到这个事务结束之后才能运行,但是在事务的执行过程中会用到不同的资源,如果事务串行执行,则许多系统资源将处于空闲状态。为了充分利用系统资源,发挥数据库共享资源的特点,应该允许多个事务并行执行
2.并发控制可能引起的问题
①丢失数据修改:两个事务读入同一数据并进行修改,第二个提交的结果破坏了第一个提交的结果,导致第一个修改被第二个覆盖掉了
②读“脏”数据:一个事务读了某个失败事务运行过程中的数据。
③不可重复读:T1读取了数据之后,T2执行了更新操作,修改了T1读取的数据
④产生“幽灵”数据
产生数据不一致的原因就是并发操作破坏了事务的隔离性。
7.3封锁和封锁协议
1.封锁
就是事务T在堆某个数据对象操作之前,先向封锁管理程序的系统组成部分发出请求,对将要操作的数据对象加锁。
①基本封锁类型有两种:排他锁+共享锁
- 排它锁:写锁,若事务T对数据对象A加上了X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
- 共享锁:读锁,若事务T对数据对象A加上S锁,则其他事务只能再对A加上S锁,而不能加X锁,直到T释放A上的S锁。
2.封锁协议/加锁协议
①一级封锁协议
- 对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)才释放
- 可以防止丢失修改,并保证事务T是可以恢复的,但不能保证可重复读和不读“脏”数据
②二级封锁协议
- 在一级封锁协议的基础上加上事务T对要读取的数据加S锁,读完后即释放S锁。
- 除了可以防止丢失修改之外,还可以防止读“脏”数据,但不能保证可重复读数据
③三级封锁协议
- 在一级封锁协议上加上事务T对要读取的数据加S锁,并知道事务结束才释放
- 除了可以防止丢失修改和读“脏”数据之外,还进一步防止不可重复读
3.活锁和死锁
1.活锁
①使某个事务永远处于等待状态,而得不到执行的现象称为活锁
②避免活锁的方法:先来先服务
2.死锁
①死锁的预防
- 一次加锁法:要求每个事务必须一次将所要使用的数据全部加锁(缺点:要求每个事务必须一次将所要使用的数据全部加锁)
- 顺序加锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁(缺点:难于规定的顺序世家封锁)
②死锁的诊断
- 超时法:事务等待时间超过规定时限,就认为发生了死锁
- 等待图法:监测事务等待图中是否存在回路
③事务等待有向图
④死锁的解除:选择一个处理代价最小的事务,将其撤销,释放此事务持有的所有锁
7.5并发调度的可串行性
1.调度:事务的执行次序
2.调度方式:
- 串行调度:多个事务一次执行的调度
- 并行调度:利用分时的方法处理多个事务的调度
3.可串行化调度:如果一个并发调度执行的结果等价于某一个串行调度的结果,称这种调度策略为可串行化的调度
4.一组事务并发调度的正确性准则:可串行化调度
5.一组事务的可串行化调度不唯一
7.6两段锁协议
为了保证并发调度的正确性,数据库管理系统的并发控制机制必须提供一定的手段来保证调度是可串行化的,目前数据库管理系统皮鞭采用两段锁协议
1.所有事务必须分两个阶段对数据项加锁和解锁
- 获得封锁:对任何数据进行读,写操作之前,要申请并获得对该数据的封锁
- 释放封锁:释放一个封锁之后,事务不再申请和获得任何其他封锁
2.若并发执行的所有事务均遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。
7.7封锁的粒度
1.封锁粒度
封锁对象的大小
2.封锁对象
属性,元组,关系,数据库
3.封锁粒度与系统的并发度和并发控制的开销密切相关
- 封锁的粒度越大,并发度越小,系统开销越小
- 封锁的粒度越小,并发度越高,系统开销越大
4.多粒度封锁
一个系统中同时支持多种封锁粒度供不同事务选择的封锁方法
5.封锁粒度选择原则
- 需处理大量元组的事务以关系为封锁粒度
- 需处理多个关系的大量元组的事务以数据库为封锁粒度
- 处理少量元组的事务以元组为封锁粒度
6.多粒度树封锁协议
可对多粒度树中每个结点独立加锁
①多粒度封锁方式:显示封锁和隐式封锁
- 显示封锁是应事务的要求直接加到数据对象上的封锁
- 隐式封锁是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁
7.封锁冲突检查
①与显示封锁冲突(本结点)
②显示封锁与隐式封锁的冲突(与上层结点,与下层结点)
对某个数据对象加锁,系统要检查
- 该数据对象
- 所有上级结点
- 所有下级结点
8.意向锁
①意向锁加锁原则:如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁,对任一结点加锁时,必须先对它的上层结点加意向锁
②三种常见的意向锁
- 意向共享锁:若对一个数据对象加IS锁,表示他的后裔结点拟加S锁
- 意向排他锁:若对一个数据对象加IX锁,表示他的后裔结点拟加X锁
- 共享意向排他锁:若对一个数据对象加SIX锁,表示对他加S锁,再加IX锁
9.具有意向锁的多粒度封锁方法
①提高了系统的并发度
②减少了加锁和解锁的开销
③在实际的数据库管理系统广泛应用产品中的到
7.8MySQL中的事务与锁机制
1.用法
①开启事务:事务的本质就是一系列数据库操作,只是要求这些数据库操作符合ACID特性,可以利用以下两种语句来开启一个事务
Begin [work]
Start transaction (后面要加read only或者read write或者with consistent snapshot)
- read only表示当前事务是一个只读事务
- read write表示当前事务是一个读写事务
- with consistent snapshot 表示启动一致性
②提交事务:commit [work]
③手动终止事务:rollback表示回滚一个事务
④自动提交:autocommit
⑤隐式的提交
- 使用create,alter,drop等语句修改数据库对象时,就会隐式的提交前面语句所属的事务
- 当使用alter user,create user,drop user,grant,rename user,revoke等语句时,也会隐式的提交前面语句所属的事务
- 当在一个事务还没提交或者还没回滚时,又开启了另一个事务
⑥保存点
在事务对应的数据库语句中设置几个点,保证在雕印rollback语句时可以指定回滚到那个点
2.锁机制
- 共享锁/排他锁:共享锁之间不互斥
- 意向锁:允许行级锁和表级锁共存,引入了意向锁,是指未来某个时刻,事务可能要加共享/排他锁,先声明一个意向
- 记录锁:封锁索引记录
- 间隙锁:封锁索引记录中的间隔
- 临键锁:记录锁和间隙锁的组合,封锁范围包括索引记录,又包含索引区间
- 插入意向锁
- 自增锁:特殊的表级别锁。