数据库并发控制
综述:事务可以一个一个的串行执行,即每个时刻只有一个事务运行,其他事务必须等到这个事务运行结束之后才能运行。事务在执行时需要不同的资源,cpu资源,I/O,有时需要通信。如果事务串行执行,则会导致很多资源闲置,为了充分利用资源,应该允许事务并行执行。在单处理机系统中,事务的并行执行实际上是事务的交叉运行,即同一时刻系统只有一个事务在运行。
并发操作带来的问题
1.丢失数据:两个事务T1和T2读入同一个数据进行修改,T2提交的修改会覆盖T1对数据的修改,导致T1对数据的修改丢失,如定飞机票的例子,
2.不可重复读:事务T1读取数据后,如果T2修改了数据,那么事务T1无法再现前一次读取的结果;包括三种情况:@1:事务T1读取某一数据后,T2对其进行了修改,当T1再次读取该数据时,得到与前一次不一样的值。@2:事务T1读取某一数据后,T2对其进行了删除操作,当T1再次按相同的条件读取时,发现数据记录消失了。@3:T1读取某一数据后,T2进行了插入操作,当T1再次按相同条件读取时,发现多了一些记录。后两种不可重复读现象有时成”幻影”现象
3.读脏数据:T1修改某一数据并写会磁盘,T2读取同一数据后,T1由于某种原因被撤销(rollback),这时T1修改的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就是脏数据,即不正确的数据。
并发控制机制就是要用正确的方式调度并发操作,使一个事务的执行不受其他事务的干扰。并发控制的主要技术有封锁,时间戳和多版本控制法等
封锁
所谓封锁就是事务T在对某个数据对象例如表,记录等操作之前,先向系统发出请求,对其加锁。加锁后T就对该数据对象拥有了一定的控制,在T释放它的锁之前,其他事务不能更新此数据。
基本的封锁类型有两种:排他锁(简称X锁)和共享锁(简称S锁)
排他锁(写锁)
T对数据对象A加上X锁,则只允许T对A进行更新操作,任何其他事务都不能对A加任何类型的锁,直到T释放了A上的锁为止,保证了在T操作A时其他事务都不能再读取或修改A的值。
共享锁(读锁)
T对数据对象A加上S锁,则T可以读A但不能修改A,其他事务只能对A加S锁不能加X锁,直到T释放S锁为止。保证了其他事务可以读A但是不能修改A。
封锁协议
除了X锁和S锁这两种基本的锁,还需要约定一些规则。例如,何时申请X锁或S锁,持锁时间,何时释放等,这些规则称为封锁协议。下面介绍三级封锁协议,分别在不同程度上解决并发带来的问题。
1.一级封锁协议
一级封锁协议指,T在修改数据R之前必须先对其加X锁,直到事务T结束时才能释放,在释放X锁之前,其他事务可以读取该数据。事物结束包括正常结束(commit)和非正常结束(rollback)。一级封锁协议可防止丢失修改。但是如果仅仅是读数据而不对其进行修改,是不需要加锁的