“可重复读”与乐观

时间:2012-12-02 10:44:44

标签: mysql sql oracle postgresql transactions

并发控制和事务隔离级别有什么区别?

我清楚地了解每一个,然而,我遇到了一些彼此相关的问题。具体来说,我看到他们的功能有些重叠,我不确定何时应该使用一个而不是另一个。或者两者都应该一起使用?

用可重复读取来表示悲观锁定是什么意思?不可重复的读取是否意味着要锁定的所有值都将被锁定?那么为什么仍然需要悲观锁定?

2 个答案:

答案 0 :(得分:5)

并发控制是处理并发连接引起的问题的任何机制的通用术语。

事务隔离级别是MySQL实现并发控制的一种机制。

有关MySQL如何在没有悲观锁定的情况下实现REPEATABLE READ的文档,请参阅Consistent Nonlocking Reads

  

一致性读取不会对其访问的表设置任何锁定,因此其他会话可以在对表执行一致读取的同时自由修改这些表。

     

假设您运行的是默认的REPEATABLE READ隔离级别。当您发出一致性读取(即普通SELECT语句)时,InnoDB会为您的事务提供一个时间点,您的查询将根据该时间点查看数据库。如果另一个事务删除了一行并在分配了您的时间点后提交,则您不会将该行视为已删除。插入和更新的处理方式相似。

答案 1 :(得分:4)

出现这个问题是因为有两种并发控制模型,有时会被SQL实现混合。

  1. 锁定,如2PL(两相锁定)
  2. 版本,如MVCC(多版本并发控制)
  3. 悲观意味着被锁定的行被锁定。乐观意味着读取的行未锁定。

    可重复读取的经典2PL实现始终是悲观的。可重复读取的多版本实现是乐观的。它不会锁定为SELECT语句读取的行,并允许其他事务修改已在SELECT中读取的行。在提交SELECT之前,这些更改对于执行SELECT的事务是不可见的。