论文部分内容阅读
摘要: 在多用户的数据库系统中,由于事务的并发性而带来了三类的并发问题。为解决这些问题,本文介绍了三种事务的并发控制方法:封锁法、时间印法和乐观法,并分析了它们的优缺点。
关键词: 并发控制 封锁 时间印 乐观
1.引言
在数据库环境中,事务是一个十分重要的概念。一个事务是由一系列的对数据库的查询操作和更新操作构成的。这些操作是一个整体,不能分割,即要么所有的操作都顺利完成,要么一个也不要做。绝不能只完成了部分操作,而还有一些操作没有完成。
而事务的并发控制则是通过调度来确保事务的并发执行的效果等同于没有并发执行时的执行效果,也就是使事务的并发执行调度等价于事务的某个可串行化调度,从而确保数据库的一致性,其作用是正确协调同一时间里多个事务对数据库的并发操作,解决资源竞争问题以保证数据库的一致性和完整性。
2.三类并发问题
并发是多个事务同时存取数据库同一数据时可能会导致数据存取不一致,数据不真实的现象。并发将引起数据争用,可导致丢失更新、读脏数据、不可重复读三类错误,破坏数据的一致性。(如表一所示)
2.1丢失更新:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。(如表二所示)
2.2读脏数据:当第二个事务选择其它事务正在更新的行时,第二个事务正在读取的数据还没有确认,并且可能由更新此行的事务所更改。
2.3不可重复读:当第二个事务多次访问同一行而且每次读取不同的数据时,称为不可重复读错误。不可重复读错误产生的原因是其它事务在此期间更改了第二个事务正在读取的数据。(如表三所示)
3.三类并发控制方法
在多用户环境下,多个用户可能同时对数据库进行操作。假设在某一时间段内有多个事务同时在进行,且它们(或其中的一部分)操作了相同的数据,若没有采用任何并发控制手段,就可能出现前文所说的数据错误。要避免这样的错误,就必须采用并发控制方法。下面具体介绍三类并发控制方法。
3.1封锁并发控制方法
封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象如数据库、表、数据块、记录和数据项等操作之前,先向系统发出请求,对其加锁,加锁成功后,事务T才可以对该数据进行操作,操作完成后,在某个时刻,事务T要释放锁。
最常用的有两种锁:排它锁(Exclusive Locks,X锁)和共享锁(Share Locks,S锁)。
排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
在运用X锁和S锁这两种基本封锁对数据对象加锁时,还需要约定一些规则,如何时申请X锁或S锁,持锁时间和何时释放等。这些规则构成封锁协议(Locking Protocol)。对应前面分析的并发操作问题,可以用以下三级协议解决:一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以解决“丢失修改”的问题。二级封锁协议:采用一级封锁协议后,若事件T在读取同一数据必须先对其加S锁,读完后即可释放S锁。二级封锁协议可以解决“读脏数据”的问题。三级封锁协议:采用一级封锁协议加上事务T在读取数据R之前必须先对其加S锁。直到事务结束才释放。三级封锁协议可以解决“不可重复读”的问题。
两段封锁协议(Two-phase Locking)也是一种最常用的封锁协议,理论上已经证明使用两段封锁协议产生的是可串行化调度。其主要内容是:
(1)在对任何数据进行读写之前,事务首先要获得对该数据的封锁。
(2)在释放一个封锁之后,事务不再获得任何其它封锁。
即事务分为两个阶段:
(1)生长阶段:获得封锁。
(2)收缩阶段:释放封锁。
两段封锁法的策略有两个主要的优点:
(1)一个事务总是读由另一个已提交的事务写入的值,因此不会因为一个事务的计算是基于它本不应该看到的文件而中止它。
(2)所有锁的请求与释放都可以由系统来处理而无须事务关心:只要访问一个文件就可以请求一个锁,当事务结束时就可以释放一个锁。
3.2时间印并发控制方法
所谓时间印法就是在每个事务启动运行时,并发控制机制赋予其惟一一个时间印(通常为事务的启动时间),以实现多事务的可串行性。后继事务有较大的时间印,事务的时间印一直保持到事务结束。
此外,每个数据实体都有时间印,分为读时间印和写时间印。读时间印即数据上一次被读出的时间,写时间印即数据最近被写入的时间。只有当时间印比数据项上的时间印大或者相当的事务才能执行对数据的操作,并在操作完成后置数据项的时间印为事务和数据项时间印的最大值,否则拒绝令操作重启。这种方法使事务的并行等价于特定的串行序列,即按时间印递增的序列,一般不会产生死锁。
采用时间印的并行控制算法主要有两种:基本时间印法和保守时间印法。在基本时间印法中,一旦发现冲突,不是等待而是重启事务,因而不会发生死锁,这是它的最大优点。但这一优点是以重启事务为代价的,为避免事务重启次数过多,又提出了保守时间印法和乐观的并发控制法等改进方法。
保守时间印法的基本思想是不拒绝任何操作,因而不必重启事务,如果操作不能执行则缓冲较年轻事务的操作直到所有较老的操作执行为止。此时,系统需要知道什么时候不再有较老的操作存在,而且缓冲事务的操作可能会造成较老事务等待较年轻事务的情况而造成死锁,实现起来比较困难。
同封锁法相比,时间印法有着不同的特性:
(1)当一个事务碰到了更大(晚)的时间印时,就要中止。
(2)封锁法在相同的情况下要么等待,要么立即执行。
(3)另一方面,时间印法不会出现死锁,这是极大的改进。
3.3乐观并发控制法
乐观的并发控制法是基于事务间的冲突操作很少,因此事务的执行可以不考虑冲突。但为解决冲突写操作,需将其暂时保存,待事务结束后由专门的机构检测是否可以将数据写到数据库中,若不能则重启该事务。
乐观并发控制法的思想惊人的简单:尽管放心去做你想做的,不用在意其他人正在做什么。如果有问题出现,那么以后再考虑吧。在实际情况中,冲突相对来说非常少,所以这个策略大部分时间都可以正常工作。
乐观并发控制算法最适合于基于私有工作空间的情况,每个事务都独立地修改各自的文件,不会涉及其他的事务。在结束的时候,新的文件要么被提交要么被释放。
乐观并发控制算法的最大优点在于:避免了死锁,而且允许最大的并行度(进程不需要去等待一个锁)。它的缺点是有时可能会失效,这时所有事务都必须退回重新运行;在重负载的情况下,算法失效的可能性将会直线上升,这使得乐观并发控制算法成了一个很糟糕的选择。
4. 总结
三类并发控制方法各有自己的优缺点,在不同的领域有自己的应用范围。在很多时候,我们还可以综合考虑两种并发控制方法,将其中的两类并发控制方法结合起来,组成一种新的并发控制方法,以适应需要。
参考文献:
[1]王珊,李盛恩.数据库基础应用.北京:人民邮电出版社,2002.8.
[2]涂振宇,曾碹.数据库并发访问机制研究.江西教育学院学报,2006.6:23-24.
关键词: 并发控制 封锁 时间印 乐观
1.引言
在数据库环境中,事务是一个十分重要的概念。一个事务是由一系列的对数据库的查询操作和更新操作构成的。这些操作是一个整体,不能分割,即要么所有的操作都顺利完成,要么一个也不要做。绝不能只完成了部分操作,而还有一些操作没有完成。
而事务的并发控制则是通过调度来确保事务的并发执行的效果等同于没有并发执行时的执行效果,也就是使事务的并发执行调度等价于事务的某个可串行化调度,从而确保数据库的一致性,其作用是正确协调同一时间里多个事务对数据库的并发操作,解决资源竞争问题以保证数据库的一致性和完整性。
2.三类并发问题
并发是多个事务同时存取数据库同一数据时可能会导致数据存取不一致,数据不真实的现象。并发将引起数据争用,可导致丢失更新、读脏数据、不可重复读三类错误,破坏数据的一致性。(如表一所示)
2.1丢失更新:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。(如表二所示)
2.2读脏数据:当第二个事务选择其它事务正在更新的行时,第二个事务正在读取的数据还没有确认,并且可能由更新此行的事务所更改。
2.3不可重复读:当第二个事务多次访问同一行而且每次读取不同的数据时,称为不可重复读错误。不可重复读错误产生的原因是其它事务在此期间更改了第二个事务正在读取的数据。(如表三所示)
3.三类并发控制方法
在多用户环境下,多个用户可能同时对数据库进行操作。假设在某一时间段内有多个事务同时在进行,且它们(或其中的一部分)操作了相同的数据,若没有采用任何并发控制手段,就可能出现前文所说的数据错误。要避免这样的错误,就必须采用并发控制方法。下面具体介绍三类并发控制方法。
3.1封锁并发控制方法
封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象如数据库、表、数据块、记录和数据项等操作之前,先向系统发出请求,对其加锁,加锁成功后,事务T才可以对该数据进行操作,操作完成后,在某个时刻,事务T要释放锁。
最常用的有两种锁:排它锁(Exclusive Locks,X锁)和共享锁(Share Locks,S锁)。
排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁又称读锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
在运用X锁和S锁这两种基本封锁对数据对象加锁时,还需要约定一些规则,如何时申请X锁或S锁,持锁时间和何时释放等。这些规则构成封锁协议(Locking Protocol)。对应前面分析的并发操作问题,可以用以下三级协议解决:一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以解决“丢失修改”的问题。二级封锁协议:采用一级封锁协议后,若事件T在读取同一数据必须先对其加S锁,读完后即可释放S锁。二级封锁协议可以解决“读脏数据”的问题。三级封锁协议:采用一级封锁协议加上事务T在读取数据R之前必须先对其加S锁。直到事务结束才释放。三级封锁协议可以解决“不可重复读”的问题。
两段封锁协议(Two-phase Locking)也是一种最常用的封锁协议,理论上已经证明使用两段封锁协议产生的是可串行化调度。其主要内容是:
(1)在对任何数据进行读写之前,事务首先要获得对该数据的封锁。
(2)在释放一个封锁之后,事务不再获得任何其它封锁。
即事务分为两个阶段:
(1)生长阶段:获得封锁。
(2)收缩阶段:释放封锁。
两段封锁法的策略有两个主要的优点:
(1)一个事务总是读由另一个已提交的事务写入的值,因此不会因为一个事务的计算是基于它本不应该看到的文件而中止它。
(2)所有锁的请求与释放都可以由系统来处理而无须事务关心:只要访问一个文件就可以请求一个锁,当事务结束时就可以释放一个锁。
3.2时间印并发控制方法
所谓时间印法就是在每个事务启动运行时,并发控制机制赋予其惟一一个时间印(通常为事务的启动时间),以实现多事务的可串行性。后继事务有较大的时间印,事务的时间印一直保持到事务结束。
此外,每个数据实体都有时间印,分为读时间印和写时间印。读时间印即数据上一次被读出的时间,写时间印即数据最近被写入的时间。只有当时间印比数据项上的时间印大或者相当的事务才能执行对数据的操作,并在操作完成后置数据项的时间印为事务和数据项时间印的最大值,否则拒绝令操作重启。这种方法使事务的并行等价于特定的串行序列,即按时间印递增的序列,一般不会产生死锁。
采用时间印的并行控制算法主要有两种:基本时间印法和保守时间印法。在基本时间印法中,一旦发现冲突,不是等待而是重启事务,因而不会发生死锁,这是它的最大优点。但这一优点是以重启事务为代价的,为避免事务重启次数过多,又提出了保守时间印法和乐观的并发控制法等改进方法。
保守时间印法的基本思想是不拒绝任何操作,因而不必重启事务,如果操作不能执行则缓冲较年轻事务的操作直到所有较老的操作执行为止。此时,系统需要知道什么时候不再有较老的操作存在,而且缓冲事务的操作可能会造成较老事务等待较年轻事务的情况而造成死锁,实现起来比较困难。
同封锁法相比,时间印法有着不同的特性:
(1)当一个事务碰到了更大(晚)的时间印时,就要中止。
(2)封锁法在相同的情况下要么等待,要么立即执行。
(3)另一方面,时间印法不会出现死锁,这是极大的改进。
3.3乐观并发控制法
乐观的并发控制法是基于事务间的冲突操作很少,因此事务的执行可以不考虑冲突。但为解决冲突写操作,需将其暂时保存,待事务结束后由专门的机构检测是否可以将数据写到数据库中,若不能则重启该事务。
乐观并发控制法的思想惊人的简单:尽管放心去做你想做的,不用在意其他人正在做什么。如果有问题出现,那么以后再考虑吧。在实际情况中,冲突相对来说非常少,所以这个策略大部分时间都可以正常工作。
乐观并发控制算法最适合于基于私有工作空间的情况,每个事务都独立地修改各自的文件,不会涉及其他的事务。在结束的时候,新的文件要么被提交要么被释放。
乐观并发控制算法的最大优点在于:避免了死锁,而且允许最大的并行度(进程不需要去等待一个锁)。它的缺点是有时可能会失效,这时所有事务都必须退回重新运行;在重负载的情况下,算法失效的可能性将会直线上升,这使得乐观并发控制算法成了一个很糟糕的选择。
4. 总结
三类并发控制方法各有自己的优缺点,在不同的领域有自己的应用范围。在很多时候,我们还可以综合考虑两种并发控制方法,将其中的两类并发控制方法结合起来,组成一种新的并发控制方法,以适应需要。
参考文献:
[1]王珊,李盛恩.数据库基础应用.北京:人民邮电出版社,2002.8.
[2]涂振宇,曾碹.数据库并发访问机制研究.江西教育学院学报,2006.6:23-24.