MySQL中默认并发控制的实现

MySQL中默认并发控制的实现,mysql,transactions,locking,innodb,mvcc,Mysql,Transactions,Locking,Innodb,Mvcc,MySQL中并发控制的默认实现是什么?是乐观锁定(多版本并发控制)还是悲观锁定(两阶段锁定)?更具体地说,InnoDb是如何做到的? 在内部,mysql(使用innodb)如何决定事务的开始是锁定行还是在冲突后回滚?innodb使用乐观锁定 事务开始时没有锁定。在执行特定查询之前,它如何知道要锁定哪些行?它甚至不知道最终需要在哪些表中锁定行 锁冲突后不需要回滚。如果您在一个事务中执行的查询由于另一个会话持有锁而必须等待,那么您的查询将等待一定的秒数(根据配置选项innodb\u lock\u w

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

innodb使用乐观锁定

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

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

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

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

似乎关闭了错误的副本:我应该看到这些链接。他们没有回答我的问题。它们解释了MVCC和乐观锁定是如何工作的。但我也看到过一些文章解释了在MySQL中如何使用2PL。在内部,mysql如何决定事务的开始是锁定行还是在冲突后回滚?我建议您编辑您的问题,将这些点合并到一起。希望现在就有答案查看“选择…更新”、“间隙锁定”、不同类型的锁、等待超时与死锁。有很多关于这个话题的博客。再多读一些,然后回答一个更具体的问题。