数据库系统的并发控制是为了解决多个事务同时执行时可能引发的异常情况而设计的。在事务一章中,我们已经介绍了多个事务并发执行可能引发的三种异常:读脏数据、不可重复读和重写未提交的数据。这些异常的原因是并发操作破坏了事务的隔离性。因此,并发控制的目的就是要通过正确的方式来调度并发操作,使得事务之间不会相互影响,从而保证并发运行事务的可串行性。
一种保证可串行性的方法是基于锁的并发控制协议。在这种协议下,当一个事务存取数据时,其他事务不能修改这个数据项,以实现互斥的存取方式。
锁是并发控制中的关键概念,可以分为两种类型:共享锁和互斥锁。共享锁表示一个事务对某个数据项的读访问,而互斥锁表示一个事务对某个数据项的读写访问。
在使用基于锁的并发控制协议时,每个事务在存取一个数据项之前必须获得该数据项上的所需锁。事务需要获取的锁的类型取决于其对数据项执行的操作。根据各种锁的类型,可以定义锁集合上的相容关系。
比如设事务Ti要求在数据项Q上获得一个A型锁,那么该事务需要在获得锁之前检查是否存在与锁集合中的其他锁有冲突的情况。如果存在冲突,则必须等待其他事务释放相应的锁。
基于锁的并发控制协议有多种实现方式,比如两阶段锁协议、多粒度锁协议、时间戳顺序协议等。每种协议都有其优缺点,需要根据具体的应用场景选择合适的协议。
在实际的数据库系统中,除了基于锁的并发控制协议外,还有其他的并发控制技术,例如并发控制粒度的控制、乐观并发控制和多版本并发控制等。这些技术都是为了解决并发操作可能引发的异常情况,保证事务的隔离性和一致性。
总结来说,数据库系统的并发控制是为了解决多个事务同时执行可能引发的异常情况而设计的。基于锁的并发控制协议是常见的实现方式,通过锁的互斥机制来保证事务之间的互斥访问,从而实现事务的可串行性。除了基于锁的协议外,还有其他的并发控制技术可供选择,根据实际的应用场景来选择最合适的并发控制策略。