我们家有一个圆形的水缸,我妈叫我测一下周长,去做个盖子。我想,周长公式是2πr,那就要测r,就要找到圆心,于是我找了两根撑衣杆,交叉之后在缸上面找圆心。我妈看了半天:“你在干啥子?”“测半径算周长啊”“。。。你不能直接拿根毛线绕一圈吗?”。。。我觉得我对不起我小学毕业证书!
1、 数据库的并发控制定义:在多用户共享系统中,许多事务可能同时对同一数据进行并发(在单处理机上利用分时方法实行多个事务同时做)操作,数据库利用并发控制子系统协调并发事务的执行,保证数据库的完整性同时避免用户得到不正确的数据。
2、 数据库的并发操作带来的问题
a) 丢失更新问题
b) 读脏数据问题
i. 脏数据的定义:在数据库技术中,把未提交的随后被撤销的数据称为脏数据
c) 不可重复读问题
3、 封锁技术
a) 锁的定义:是一个与数据项相关的变量,对可能应用于该数据项上的操作而言,锁描述了该数据项的状态。通常每个数据项都有一个锁。
b) 锁的作用:是使并发事务对数据库中数据项的访问能够同步。
c) 封锁技术的分类:
i. 排他型封锁(X锁,写锁):如果事务T对某个数据R实现了X锁,那么在T对数据R解除封锁之前,不允许其他事务T再对该数据加任何类型的锁。
1. 申请X锁操作“XFIND R”
2. 解除X锁操作“XRELEASE R”
ii. 共享型封锁(S锁,读锁):如果事务T对某个数据R实现了S锁,仍允许其他事务再对该数据加S锁,但在对该数据的所有S锁都解除之前不允许任何事务对该数据加X锁
1. 申请S锁操作“SFIND R”
2. 升级和写操作“UPDX R”
3. 解除S锁操作“SRELEASE R”
d) 封锁的粒度:封锁对象的大小称为封锁的粒度(Granularity)。封锁的粒度越大,并发度越小,系统开销越小;封锁的粒度越小,并发度越大,系统开销越大
e) 封锁协议:运行封锁机制时,需要约定一些跪着,这就是封锁协议
i. 一级封锁协议
1. 定义:事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放,但只读数据的事务可以不加锁
2. 优点:防止“丢失修改”
3. 缺点:不加锁的事务,可能读脏数据也可能不可重复读
ii. 二级封锁协议
1. 定义:事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放,但其他事务在读数据之前必须先加S锁,读完数据后即可释放S锁
2. 优点:防止“丢失修改”和“读脏数据”
3. 缺点:对加S锁的事务,可能不可重复读
iii. 三级封锁协议
1. 定义:事务在修改数据之前,必须先对该数据加X锁,直到事务结束时才释放,但其他事务在读数据之前必须先加S锁,直到事务结束后才释放S锁
2. 优点:防止“丢失修改”、“读脏数据”、“不可重复读”
3. 缺点:无
f) 封锁产生的问题
i. 活锁:指两个或两个以上的事务再执行过程中,T1事务封锁了数据R,事务T2又请求封锁R,于是T2等待,T3也请求封锁R,当T1释放了R上的封锁后,系统优先批准了T3事务进行封锁,而T2继续等待,这就是活锁。
ii. 饿锁:指两个或两个以上的事务再执行过程中,有一个事务一致无法得到要封锁的数据R。
iii. 死锁:指两个或两个以上的事务再执行过程中,因争夺资源而造成一种相互等待的现象,若无外力作用,它们将无法推进下去,此时称为死锁
4、 数据库并发操作的调度
a) 事务的调度的定义:事务的执行次序称为调度
b) 串行调度:多个事务依次执行
c) 并发调度:利用分时的方法,同时处理多个事务
d) 并发调度的可串行化:每个事务中,语句的先后顺序在各种调度中始终保持一致,在这个前提下,如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为可串行化的调度,否则是不可串行化的调度。
5、 SQL对并发处理的支持
a) 定义:SQL2对事务的存取模式和隔离级别,做了具体规定,并提供语句让用户使用,以控制事务的并发执行
b) 事务的存取模式
i. 只读型(Read Only):事务对数据库的操作只能是读操作
Set transaction read only
ii. 读写型(Read Write):事务对数据库的操作可以是读操作也可以是写操作
Set transaction read write
c) 事务的隔离级别
i. 可串行化(Serializable):允许事务与其他事务并发执行,但系统必须保证并发调度是可串行化,不致发生错误(高)
Set transaction isolation level serializable
ii. 可重复读(Repeattable read):只允许事务读已提交的数据,并且在两次读同一数据时不允许其他事务修改此数据(中)
Set transaction isolation level repeatable read
iii. 读提交数据(Read commited):允许事务读已提交的数据,但不要求可重复读(低)
Set transaction isolation level read committed
iv. 可以读未提交数据(Read Uncommitted):允许事务读已提交或未提交的数据(最低)
Set transaction isolation level read uncommitted
零测试