0

MySQL中并发控制的默认实现是什么?是乐观锁(多版本并发控制),还是悲观锁(2相锁)?更具体地说,InnoDb 是如何做到的?在内部,mysql(带有innodb)如何决定事务的开始是锁定行还是在冲突后回滚?

4

1 回答 1

1

InnoDB 使用乐观锁。

事务开始时没有锁定。在您执行特定查询之前,它如何知道要锁定哪些行?它甚至不知道您最终需要在哪个表中锁定行。

锁冲突后不需要回滚。如果您在一个事务中执行查询,由于另一个会话持有锁而必须等待,那么您的查询最多等待一定的秒数(根据配置选项innodb_lock_wait_timeout,默认为 50 秒)。

  • 如果另一个会话在超时之前提交,那么您的会话将停止等待,获取它需要的锁,然后继续查询。
  • 如果您的等待在其他会话提交之前超时,您的查询将返回错误。这仍然不会回滚您的事务;您在事务期间所做的先前更改仍然可以提交。您甚至可以再次尝试超时的查询。

例外:在死锁的情况下,InnoDB 选择死锁涉及的事务之一,并强制回滚其中一个。它尝试选择修改较少行的事务。如果交易是绑定的,那么选择是任意的。

于 2020-07-12T15:59:57.773 回答