MySQL 查询 synchronization/locking 问题

MySQL query synchronization/locking question

我有一个似乎无法在网上找到的快速问题,不确定我是否使用了正确的措辞。

MySql 数据库是否自动同步查询或大约同时进入?例如,如果我发送查询以将某些内容插入数据库,同时另一个连接向数据库中的 select 发送查询, MySQL 是否会在插入发生时自动锁定数据库,然后在完成后解锁,允许 select 查询访问它? 谢谢

了解像 InnoDB 这样的现代数据库引擎如何工作的关键是 Multi-Version Concurrency Control 或 MVCC。这就是并发操作可以 运行 并行,然后在完全提交时协调到数据库的一致 "view" 的方式。

如果您曾经使用过 Git,您就会知道如何对同一个基础进行多个并行更新,但只要它们能够干净利落地合并在一起,就不会发生冲突。数据库也是这样工作的,您可以在其中开始一个事务,应用一系列操作,然后提交它。如果这些应用没有冲突,则提交成功。如果出现问题,事务将回滚,就好像它从未发生过一样。

这种同时处理多个操作的能力使支持事务的数据库引擎真正强大。它是满足 ACID standard.

所必需的重要组成部分

MyISAM,来自 MySQL 3.0 的原始引擎,没有任何这些功能,并且在任何 INSERT 操作上锁定整个数据库以避免冲突。它像您想象的那样工作。

在 MySQL 中创建数据库时,您可以选择引擎,但默认使用 InnoDB。确实没有理由使用 MyISAM,因为该引擎的任何有趣功能(例如全文索引)都已移植到 InnoDB。

Do MySql databases automatically synchronize queries coming in at around the same time?

是。

这样想:不存在同时查询这样的东西。 MySQL 总是先执行其中一个,然后再执行第二个。 (这不完全正确;服务器远比这复杂。但它有力地为我们的用户提供了顺序查询的错觉。)

如果您从一个连接发出单个 INSERT 查询或单个 UPDATE 查询,而您从另一个连接发出 SELECT,您的 SELECT 将得到一致的结果。这些结果将反映更改之前或之后的数据状态,具体取决于先进行的查询。

您甚至可以做这样的事情(读取-修改-写入操作)并保持一致性。

 UPDATE table 
    SET update_count = update_count + 1, 
        update_time = NOW()
  WHERE id = something

如果您必须像执行一个操作一样执行多个 INSERTUPDATE 操作,则需要使用 InnoDB 引擎,并且需要使用事务。事务在进行时将阻止 SELECT 操作。教您使用事务超出了 Stack Overflow 答案的范围。