![](https://i-blog.csdnimg.cn/blog_migrate/65b365c30c3ce25eab2619e9e56b40ba.jpeg)
数据库(2)
数据库设计(2)
事务并发控制
![](https://i-blog.csdnimg.cn/blog_migrate/25dbc88b55d4ea78727c33c97af433a3.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/25dbc88b55d4ea78727c33c97af433a3.jpeg)
1.事务(transaction)的定义:指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)
包括:SQL语句的集合,存储过程体,高级语言的事件
2.事务的状态:active partially committed failed aborted committed
活动状态
事务在执行时的状态叫活动状态。
部分提交状态
事务中最后一条语句被执行后的状态叫部分提交状态。
失败状态
事务不能正常执行的状态叫失败状态。
提交状态
事务在部分提交后,将往硬盘上写入数据,当最后一条信息写入后的状态叫提交状态。进入提交状态的事务就成功完成了。
中止状态
事务回滚并且数据库已经恢复到事务开始执行前的状态叫中止状态
3.事务具有4个属性:ACID特性
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响
4.DBMS的事务的两个主要工作:恢复 并发控制 recovery & Concurrency control ==事务管理
5.为什么要并发控制:
a.增加处理器和硬盘的利用率
d.减少平均反应时间
c. 共享资源
d.隔离性的要求
6.
schedule(计划表) :一组事务的结合,并有相应事务的执行顺序
分类:serial schedule(串行计划表) equivalent schedule (等价计划表)
7.每个事务有很多变量,事务获取数据库资源通过 read() write()
8.在交叉执行事务的时候,会因为 read 和write 顺序不一样出现错误。
9.相关概念:
冲突等价转换:把相邻操作交换顺序而不引进冲突
冲突等价:可以通过冲突等价转换的两个计划表
冲突串行化:一个schedule 可以冲突等价于一个串行的schedule
10.Lock-based protocols : 利用锁的机制来保证串行化
操作:Lock Unlock
shared lock 共享锁: 只读不写 只有共享锁之间才能对同一个变量加锁
exclusive lock 独锁: 可读可写 只要对某个变量加了独锁,那么其他事务不能再附加任何锁,包括共享锁。
操作: S_lock(变量) S_unlock(变量) X_lock(变量) X_unlock(变量)
11. Two phase locking (2PL协议)
事务访问变量前,必须在合适的位置加锁。
如果某个变量的会产生冲突的锁在其他事务那边,改事务等待。
事务一旦释放了某个锁,就不能再获取其他锁
两个阶段:一:获取锁 二:释放锁
Lock-point:封锁点-------针对当前事务已经完成获取锁(最后一个获取锁执行完之后的点)
(每个事务都保证了,先获取锁,后释放锁,都有一个Lock-point)
只要符合 2PL协议的schedule都是可以线性化的。
该协议是阻塞协议(blcoking protocol):因为事务会发生等待,该协议下灰产生死锁
死锁
1.死锁的解决办法:
Ostrich(鸵鸟):假装什么事情都没有发生
Timeout :超过时间,就采取措施
检测和恢复: 维持一个等待图来检测是否有死锁发生,通常采用回滚(rollback==abort restart)
避免死锁
预防法
2.锁的机制的目的就是保证珂串行化(这样就是安全的)
3.一致性的4个级别:
READ UNCOMMITTED
读取尚未由其他事务提交的修改后的数据值,这些行为称为“脏”读。
READ COMMITTED
READ COMMITTED(Nonrepeatable reads)是SQL Server默认的隔离级别。该级别通过指定语句不能读取其他事务已修改但是尚未提交的数据值,禁止执行脏读。在当前事务中的各个语句执行之间,其他事务仍可以修改、插入或删除数据,从而产生无法重复的读操作,或“影子”数据。比如,事务1读取了一行,事务2修改或者删除这一行并且提交。如果事务1想再一次读取这一行,它将获得修改后的数据或者发现这一样已经被删除,因此事务的第二次读取结果与第一次读取结果不同,因此也叫不可重复读。
Repeatable Read
该级别包括READ COMMITTED,并且另外指定了在当前事务提交之前,其他任何事务均不可以修改或删除当前事务已读取的数据。并发性低于 READ COMMITTED,因为已读数据的共享锁在整个事务期间持有,而不是在每个语句结束时释放。也叫可重复读。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。该级别包括REPEATABLE READ,并增加了在事务完成之前,其他事务不能向事务已读取的范围插入新行的限制
恢复:recovery
1.失败的类型:
事务失败:逻辑错误 系统错误(死锁)
系统崩溃 system crash
磁盘失败
2.为什么要恢复: 为了确保原子性,持久性
3. 确保原子性需要:找到那些事务,开始了却没有成功提交的; find 事务对数据库做出的改变,然后Undo
all the changes
4.即使事务被提交了,但是仍然可能破坏原子性(可能还在缓冲区,没有写到磁盘上)。确保committed之后flush一下。使缓冲区的内容写到磁盘上。
5、确保持久性:找到所有事务已经成功提交的,确保都已经报修改写到磁盘,否则redo all changes
6.还记得ACID吗,I :隔离性就是在并发控制的时候 C:一致性,就是那个四个级别。
7.恢复的算法要求我们保存足够的信息,使系统能够从失败处恢复,同时使系统恢复的操作符合ACID中的ACD
足够信息:利用稳定的存储器存储有用信息, 日记(logs)
8.logs 维护了数据库更新活动的记录。
日记一定要是 write-ahead logs (WAL): 所有的操作一定要先记录,被存储在稳定的存储器上(在操作运行前)
9.两个操作 undo redo