并发控制概述
为保证事务的隔离性和一致性,DBMS需要对并发操作进行正确的调度
并发操作引起的数据库不一致的现象:
丢失修改[ww]
两个事务T1和T2读同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。如下图:
不可重复读[rw(r)]
(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再读该数据时,得到与前一次不同的值。如下图:
(2)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘的消逝了。
(3)事务T1按照一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
后两种不可重复读有时候称为幻影现象
读脏数据[wr]
读脏数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一个数据后,T1由于某种原因被撤销(T1回滚),这时T2读到的数据与数据库中的数据不一致,则T2读到了脏数据。
封锁
所谓封锁就是事务T再对某个数据对象例如表、记录等操作执行之前,先向系统发出请求,对其加锁,加锁之后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象
排它锁又称写锁。若事务T对数据对象加上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做任何修改。
读锁和写锁的关系(图为封锁类型的相容关系矩阵):