并发控制技术

并发控制的主要技术有封锁(locking)、时间戳(timestamp)、乐观控制法(optimistic sheduler)和多版本并发控制(multi-version concurrency control,MVCC)

并发可能造成的后果

  1. 不可重复读

    事务T1读取某一数据之后,事务T2对其进行了修改,当事务T1再次读该数据时,得到与前一次不同的值。

  2. 脏读

    事务读取了未提交的数据。

  3. 幻读(不可提交的一种)

    事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录。

  4. 丢失修改

    两个不同的事务同时获得了相同的数据,又都对这个数据进行了修改,那么先提交的事务的更新就会被后提交事务的更新覆盖掉,叫做丢失更新。

封锁

排它锁(X锁)

排它锁又称写锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁直到T释放A上的锁为止。

共享锁(S锁)

共享锁又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事物只能再对A加S锁,而不能加X锁。

封锁协议

一级封锁协议

一级封锁协议是指,事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。

二级封锁协议

二级封锁协议是指,在一级封锁协议基础上增加事务T在读数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议出防止了丢失修改,还可以进一步防止读“脏”数据。

三级封锁协议

三级封锁协议是指,在一级封锁协议的基础上增加事务T在读数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读。

两段锁协议

是指所有的事务必须分两个阶段对数据项加锁和解锁。即事务分两个阶段,第一个阶段是获得封锁。事务可以获得任何数据项上的任何类型的锁,但是不能释放;第二阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,但不能申请。

遵循两段锁协议一定是可串行化的‘;不遵循两段锁协议,可能是串行化的,也可能不是

采用两段锁协议可能产生死锁

事务的隔离级别

  1. READ UNCOMMITTED(读未提交):最低级别,任何情况都无法保证。

  2. READ COMMITTED(读已提交):可避免读脏数据。

  3. REPEATABLE READ(可重复读):可避免读脏数据,不可重复读。

  4. SERIALIZABLE(串行化):最高级别,可避免读脏数据,不可重复读,幻读。