数据库的并发

此为读书笔记个人总结  王春华 2005-9-13

并发与恢复一样,与底层系统是关系型还是其它类型无关。

DBMS允许多个事务同时访问数据库,这即是并发。首先考虑任何一个并发机制必须提及的一些问题是,在三种情况下必定将发生错误。这三种情况是,丢失更新问题、依赖未提交问题和不一致分析问题。即在这三种情况下,一个事务即使自身是正确的,如果其他的某个事务以某种方式与之交错运行,也可能引发错误。解决并发问题可以采用锁机制,但是有时锁机制会出现死锁问题。死锁发生时,系统必须能检测并解除它。对死锁问题,有些系统采用的是检测死锁,即是检测等待图中的环;有些系统采用的是超时机制,假设在预定时间内不工作的事务发生了死锁。解除死锁就是选出一个死锁事务,即图中环上的一个事务,将之回滚,从而释放其所拥有的锁使得其他的一些事务可继续执行下去。

死锁,发生于两个或更多事务同时处于等待状态,每个事务都在等待其它事务释放锁,可使其继续进行。理论上死锁可涉及到三、四个或更多事务,但是SYSTEM R实验表明,实际上死锁几乎从未涉及到两个以上的事务。

锁,分为排它锁exclusive lock ,也称为X锁、写锁;共享锁shared lock,也称为S锁、读锁。基本思想是,当一个事务需要确保其感兴趣的对象,通常是一数据库元组,在其完成时不会发生某种形式的改变,它必须获得该对象上的一个锁。锁的作用就是锁住对象使得其它事务无法访问,尤其是阻止其他事务改变该对象。

数据存取协议或称为锁协议,其运用X锁和S锁保证了上面提到的并发问题不会发生。1.事务在检索元组前需要获得该元组上的S锁。2.事务在更新元组前需要获得该元组上的X锁。相应地,如果其已经具有了该元组上的  S锁,因为通常是RETRIEVE—UPDATE的顺序,必须将其从S锁升级到X锁。注意,事务对元组的锁请求通常都是隐式的,‘检索’元组的请求通常隐含着对相关元组的S锁请求,‘更新’元组的请求通常隐含着对相关元组的X锁请求。当然,术语‘更新’包括INSERT/DELETE/UPDATE,但是对INSERT和DELETE操作,规则需进一步的提炼,这里略去了细节。

3.如果事务B的锁请求因为与事务A已具有的锁冲突而被拒绝,事务B处于等待状态,直到A的锁被释放掉。注意,系统必须保证B不会永远处于等待状态,这是可能的,通常称为活锁。避免活锁的简单方法是采用先来先服务的策略。

4.X锁将一直保持直到事务结束,COMMIT或ROLLBACK。

 

小结

    本部分考虑了有关并发控制的问题。首先介绍了并发事务的交替执行中没有并发控制时会产生的三个问题,即:丢失更新、未提交依赖和不一致分析。产生这些问题的调度都不是可以串行化的,即不能等价于涉及相同事务的某个串行调度。

解决这些问题的最广泛的技术是锁。锁的基本类型有两种,即共享锁(S锁)和排它锁(X锁)。如果某个事务在某个对象上施加了S锁,则其他事务也能在该对象上申请S锁,但不能对该对象申请X锁;如果某个事务在某个对象上施加了X锁,则其他事务不能对该对象申请如何锁。为了保证不发生丢失修改,可以引入这样一个锁协议:对任何要检索的对象申请S锁,对任何要更新的对象申请X锁,并将锁保持到事务结束。该协议可以实现事务的串行化。

 上面所描述的协议是两段锁协议的一个较强但很常见的形式。由此得出两段锁定理:如果所有的事务都遵循该协议,那么所有的调度都是可串行的。可串行调度意味着:如果AB是该调度所涉及的两个事务,那么或者A看到B的输出,或者B看到A的输出。遗憾的是,两段锁协议可能导致死锁的发生。打破死锁的办法是选择死锁事务中的某一个事务作为牺牲者v i c t i m),然后将该事务回滚(从而释放牺牲者所锁定的全部资源)。

  一般说来,如果事务未达到完全可串行性,则不能保证一定安全。但系统一般都允许事务在某个实际上并不安全的隔离级别上运行,这样可以减少资源的竞争并提高事务吞吐量。

  接下来主要说明锁粒度的问题及相应的意向锁思想。意向锁的基本观点是:事务在某些对象(如数据库中的元组)上获得某种锁前,它必须先获得在该对象的“父对象”上的一个适当的意向锁。例如,对于一个元组则要在包含该元组的关系变量上获得一个意向锁。这样的意向锁通常以隐式申请方式实现,就像元组上的S锁和X锁以隐式方式申请一样。但是也应该提供某些意向锁的显式锁语句以允许事务在必要时能够获得较隐式方式获得的锁。

   最后给出了S Q L对并发控制支持的几个要点。S Q L基本上不提供任何的显式锁能力,但它支持多种隔离级别,即:读未提交、读已提交、可重复读和可串行化的等四种。这些不同的隔离级别可以由D B M S通过非显式锁方式加以实现。 在连接数据库后可以设置操作的隔离级别。

对于完整性的重要性问题,这里进一步给出一个简要的说明。在较泛泛地讲数据库正确时,一般指数据库没有违背任何已知的完整性约束。因此容易看出,对于未提供较多完整性支持的系统而言,它只能提供较弱意义上的数据库“正确”。在第1 4章中提到的恢复指的是恢复到以前的某个已知的“正确状态”,而本章中的并发(或者说并发控制)则指的是一个可串行调度将把数据库从一个“正确状态”转移到另一个“正确状态”。由此可见,完整性是比恢复和并发更为基本的问题。事实上,完整性是单用户系统中也要考虑的问题。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值