徐爱芸
摘要:为了充分利用系统资源,发挥共享资源的特点,数据库系统允许执行多个并发事务,在任何给定的时刻有可达数百个正在执行的却只部分完成的事务,这是由用户来选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离级别的执行选项。
关键词:事务;隔离级别;并发执行;并发控制
数据库系统的最大特点是共享,允许多个用户或多种应用相互覆盖地共享数据集合。在互联网时代,成千上万的不同地点的计算机每秒执行上百的操作,同一时间有多个操作影响同一数据,即存在并发操作,如果不加以控制,可能带来数据不一致问题:更新丢失;不可重复读;读脏数据。为保证并发事务执行时数据的正确性和一致性,对并发事务要进行控制。
1 事务管理器
负责事务的正确执行是事务管理器,它接受来自应用的命令,包括BEGIN TRANSACATION、COMMIT、ROLLBACK,而将事务操作传给日志管理器。并发控制管理器对并发执行的事务进行控制,通过加锁和封锁协议保证并发执行的事务保持隔离性。其流程如图1所示。
2 事务隔离级别
在实际开发中,直接操作数据库中各种锁的几率相对比较少,更多的是利用数据库提供的四个隔离级别:未提交读、已提交读、可重复读、可序列化,用隔离封装锁。隔离级别从上到下依次增加,级别越低,引起的问题也就比较多,比如脏读、丢失更新等;隔离级别越高,需要管理更多的锁,无法并行处理,性能方面又受损。在实际的系统中只需要根据业务需求选择一种当适合的隔离级别。一种隔离级别,就有一套利用锁的方案,如此设计的目的就是为了平衡性能和功能。
2.1 读未提交(Read Uncommitted)
“读未提交”提供了事务之间最小限度的隔离,事务没有获得读锁也可以执行该操作,事务可以读取其它事务已经在其上加过写锁的数据,即允许脏读。其实现的机制通过实验验证,过程如表1所示。
未提交读不允许更新丢失,如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,该隔离级别可以通过排它锁实现。
2.2 讀已提交(Read Committed)
“读已提交”只能读提交的数据,不允许脏读,但允许不可重复读。这可以通过共享锁和排它锁实现。读取数据的事务允许其它事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。其实现的机制通过实验验证,过程如表2所示。
2.3 可重复读(Repeatable Read)
“可重复读”通过共享锁和排它锁实现,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其它事务,禁止不可重复读和脏读。其实现的机制通过实验验证,过程如表3所示。
2.4 序列化(Serializable)
“序列化”提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
3 结语
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免读脏数据,而且具有较好的并发性能。尽管它会导致不可重复读、虚读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
参考文献:
[1] 送金玉,陈萍,陈刚.数据库原理与应用(第2版)[M].清华大学出版社,2011(06).
[2] 尹为民,数据库原理与技术(第2版)[M].科学出版社,2010(01).
(作者单位:江汉大学数学与计算机科学学院)