并发控制和事务隔离级别有什么区别?
我清楚地理解它们中的每一个,但是,我在将它们相互关联时遇到了一些问题。具体来说,我看到它们的功能有些重叠,我不确定什么时候应该使用另一个。还是应该两者一起使用?
另外,用可重复读取说悲观锁定是什么意思?可重复读取不是已经意味着所有要编辑的值都将被锁定吗?那么为什么仍然需要悲观锁定呢?
并发控制和事务隔离级别有什么区别?
我清楚地理解它们中的每一个,但是,我在将它们相互关联时遇到了一些问题。具体来说,我看到它们的功能有些重叠,我不确定什么时候应该使用另一个。还是应该两者一起使用?
另外,用可重复读取说悲观锁定是什么意思?可重复读取不是已经意味着所有要编辑的值都将被锁定吗?那么为什么仍然需要悲观锁定呢?
并发控制是处理由并发连接引起的问题的任何机制的通用术语。
事务隔离级别是 MySQL 实现并发控制的一种机制。
有关MySQL 如何在没有悲观锁定的情况下实现的文档,请参阅Consistent Nonlocking Reads :REPEATABLE READ
一致读取不会对其访问的表设置任何锁定,因此其他会话可以在对表执行一致读取的同时自由修改这些表。
假设您在默认
REPEATABLE READ
隔离级别下运行。当您发出一致的读取(即普通SELECT
语句)时,InnoDB 会为您的事务提供一个时间点,根据该时间点您的查询会看到数据库。如果另一个事务在分配您的时间点后删除了一行并提交,您不会看到该行已被删除。插入和更新的处理方式类似。
之所以出现这个问题,是因为有两种并发控制模型,它们有时会被 SQL 实现混合使用。
悲观意味着读取的行被锁定。乐观意味着读取的行没有被锁定。
The classic 2PL implementation of Repeatable Read is always pessimistic. The multiversion implementation of Repeatable Read is optimistic. It does not lock the rows that are read for a SELECT statement and allows other transactions to modify the rows that have been read in a SELECT. Such changes are not visible to the transaction that performed the SELECT, until it is committed.