并发控制和事务隔离级别有什么区别?
我清楚地了解每一个,然而,我遇到了一些彼此相关的问题。具体来说,我看到他们的功能有些重叠,我不确定何时应该使用一个而不是另一个。或者两者都应该一起使用?
用可重复读取来表示悲观锁定是什么意思?不可重复的读取是否意味着要锁定的所有值都将被锁定?那么为什么仍然需要悲观锁定?
答案 0 :(得分:5)
并发控制是处理并发连接引起的问题的任何机制的通用术语。
事务隔离级别是MySQL实现并发控制的一种机制。
有关MySQL如何在没有悲观锁定的情况下实现REPEATABLE READ
的文档,请参阅Consistent Nonlocking Reads:
一致性读取不会对其访问的表设置任何锁定,因此其他会话可以在对表执行一致读取的同时自由修改这些表。
假设您运行的是默认的
REPEATABLE READ
隔离级别。当您发出一致性读取(即普通SELECT
语句)时,InnoDB会为您的事务提供一个时间点,您的查询将根据该时间点查看数据库。如果另一个事务删除了一行并在分配了您的时间点后提交,则您不会将该行视为已删除。插入和更新的处理方式相似。
答案 1 :(得分:4)
出现这个问题是因为有两种并发控制模型,有时会被SQL实现混合。
悲观意味着被锁定的行被锁定。乐观意味着读取的行未锁定。
可重复读取的经典2PL实现始终是悲观的。可重复读取的多版本实现是乐观的。它不会锁定为SELECT语句读取的行,并允许其他事务修改已在SELECT中读取的行。在提交SELECT之前,这些更改对于执行SELECT的事务是不可见的。