来源
《数据库系统原理》
并发操作问题
事务是并发操作的基本单位,保证事务的ACID特征是事务处理的重要任务,而事务的ACID特征可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确调度。其中完整性校验可以保证一个事务单独执行时,若输入的数据库状态是正确的,则其输出的数据库状态也是正确的,但当多个事务交错执行时,可能出现不一致的问题,这也称为并发操作问题,典型的有如下三种:丢失更新、不可重复读和读”脏“数据。
(1)丢失更新
设有两个事务T1和T2,当它们同时读入同一数据并加以修改时,事务T2的提交结果会破坏事务T1的提交的结果,由此导致事务T1的修改丢失。这就是一种由于对数据的并发操作而带来的数据不一致。
(2)不可重复读
设有两个事务T1和T2,不可重复读是指事务T1读取事务后,事务T2执行更新操作,使事务T1无法再现前一次读取的结果。通常,不可重复读包括三种情况。
i)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值。
ii)事务T1按一定的条件从数据库中读取某些数据后,事务T1删除了其中部分记录,当事务T1再次按相同条件读取数据时,发现某些记录神秘的消失了。
iii)事务T1按一定的条件从数据库中读取某些记录后,事务T2插入了一些记录,当事务T1再次按相同条件读取数据时,发现多了一些记录。
(3)读”脏“数据
设有两个事务T1和T2,读”脏“数据是指,事务T1修改了某一数据,并将其写回磁盘,事务T2读取同一数据后,事务T1由于某种原因被撤销,这时事务T1已经修改过的数据恢复原值,事务T2读到的数据,就与数据库中的数据不一致,则事务T2读到的数据就为‘’脏‘数据,即不正确的数据。
产生上述三类数据不一致的主要原因是并发操作破坏了事务的隔离性,并发控制机制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致。
解决并发操作所带来的数据不一致问题的方法有封锁、时间戳、乐观控制法和多版本并发控制等。本节接下来主要介绍封锁方法,这也是众多数据库产品采用的基本方法。