事务与并发控制
所谓事务是用户定义的一个数据操作序列,这些操作可作为一个完整的工作单元,要么全部执行,要么全部不执行,是一个不可分割的工作单位.
事务中的操作一般是对数据的更新操作,包括增,删,改.
事务的特征:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持续性(Durability) ACID
并发操作问题
丢失更新:事务T1,T2同时读入同一数据并加以修改,T2的提交结果会破坏T1提交的结果.
不可重复读:事务T1读取数据后,事务T2执行更新操作,使T2无法再现前一次读取结果.
读"脏"数据: 事务T1修改数据后撤销,使得T2读取的数据与数据库中不一致.
封锁是最常用的并发控制技术.
基本思想:需要时,事务通过向系统请求对它所希望的数据对象加锁,以确保它不被非预期改变.
锁:一个锁实质上就是允许或阻止一个事务对一个数据对象的存取特权.
基本的锁类型: 1)排他锁(X锁),用于写操作. 2)共享锁(S锁),用于读操作
封锁的工作原理:
1)若事务T对数据D加了X锁,则所有别的事务对数据D的锁请求都必须等待直到事务T释放锁.
2)若事务T对数据D加了S锁,则别的事务还可对数据D请求S锁,而对数据D的X锁请求必须等待直到事务T释放锁.
3)事务执行数据库操作时都要先请求相应的锁,即对读请求S锁,对更新请求X锁.这个过程一般是由DBMS在执行操作时自动隐含地进行.
4)事务一直占有获得的锁直到结束时释放.
封锁的粒度: 通常用粒度来描述封锁的数据单元的大小,DBMS可以决定不同粒度的锁.粒度越细,并发性越大,但软件复杂性和系统开销也就越大.
封锁的级别:封锁的级别又称为一致性级别或隔离度.
0级封锁: 不重写其他非0级封锁事务的未提交的更新数据(实用价值低).
1级封锁: 不允许重写未提交的更新数据.防止了丢失更新的发生.
2级封锁: 既不重写也不读未提交的更新数据(防止了读脏数据).
3级封锁: 不读未提交的更新数据,不写任何(包括读操作)未提交数据. //不代表完全封锁
死锁和活锁: 活锁-先来先服务 死锁-预防 1)一次性锁请求 2)锁请求排序 3)序列化处理 4)资源剥夺
可串行性: 一组事务的一个调度就是它们的基本操作的一种排序.
在数据库系统中,可串行性就是并发执行的正确性准则,即当且当一组事务的并发执行调度是可串行化的,才认为它们是正确的.
两段封锁法(Two-Phase Locking,2PL)
1)发展(Growing)或加锁阶段 2)收缩(Shrinking)或释放锁阶段