"可重复读"与乐观

Dey*_*ang 8 mysql sql oracle postgresql transactions

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

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

说重复读取的悲观锁定是什么意思?不可重复的读取是否意味着要锁定的所有值都将被锁定?那么为什么还需要悲观锁定呢?

egg*_*yal 5

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

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

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

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

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


fre*_*edt 5

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

  1. 锁定,如 2PL(两相锁定)
  2. 版本,如MVCC(多版本并发控制)

悲观意味着读取的行被锁定。乐观意味着读取的行没有被锁定。

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