事物是并发控制的基本单位。保证事物的ACID特性是事物处理的重要任务。
而事物的ACID特性被破坏的原因之一是多个事物对数据的并发操作造成的。
事物的并发操作会造成三类问题:丢失修改、不可重复读、脏读。
丢失修改
当事物T1和事物T2同时读取同一记录,T2的提交导致T1的提交被覆盖。
不可重复读
也称幻读,T1读取两次记录,后一次用作验证,在第二次读之前,T2修改、增加、删除都会导致T1的两次读取结果不同。
脏读
T1对某条记录进行操作,T2在其后读取该记录,然后由于某种原因T1撤销提交事务,导致T2读取的是错误的数据。
那么如何解决上述问题呢?
并发控制机制就是要用正确的方式调度并发操作,保证一个事物的执行不受其他事物的干扰。
并发控制的主要技术有:封锁、时间戳、客观控制法和多版本并发控制等。
封锁
封锁就是事物在对某个数据对象如表、记录操作之前,先向系统发出请求,对其加锁。这样,该事物释放锁之前,其他事物都无法对其进行操作。
封锁的类型有两种:排它锁(exclusive locks,简称X锁)、共享锁(share locks,简称S锁)。
排它锁又称为写锁。当事物T对数据对象A加了X锁,则只允许T读取和修改A,在T释放X锁之前,其他事物都不能对A进行读取和写入。
共享锁又称为读锁。当事物T对数据对象A加了S锁,则只能读取A,不能修改A,其他事物可以对A加S锁,但不能加X锁。
关于何时申请X锁或S锁、持锁时间、何时释放等,还要有一些规则,这些规则成为封锁协议。
一级封锁协议
事物T在修改数据之前,必须先对其加X锁,直到事务结束才释放。
二级封锁协议
在一级封锁协议的基础上增加事物T在读取数据R之前必须对其加S锁,读完后即可立即释放S锁。
三级封锁协议
在一级封锁协议的基础上增加事物T在读取数据R之前必须对其加S锁,直到事物结束才释放S锁。