我有一个快速的问题,我似乎无法在网上找到,不确定我是否使用了正确的措辞。
MySql 数据库是否自动同步查询或同时进入?例如,如果我发送查询以向数据库插入某些内容,同时另一个连接发送查询以从数据库中选择某些内容,MySQL 是否会在插入发生时自动锁定数据库,然后在完成时解锁允许选择查询来访问它?谢谢
我有一个快速的问题,我似乎无法在网上找到,不确定我是否使用了正确的措辞。
MySql 数据库是否自动同步查询或同时进入?例如,如果我发送查询以向数据库插入某些内容,同时另一个连接发送查询以从数据库中选择某些内容,MySQL 是否会在插入发生时自动锁定数据库,然后在完成时解锁允许选择查询来访问它?谢谢
了解像 InnoDB 这样的现代数据库引擎如何工作的关键是多版本并发控制或 MVCC。这就是同时操作可以并行运行的方式,然后在完全提交时协调到数据库的一致“视图”中。
如果您曾经使用过 Git,您就会知道如何对同一个基础进行多次更新,但只要它们可以干净地合并在一起,就不会发生冲突。数据库也是这样工作的,您可以在其中开始事务,应用一系列操作并提交它。如果那些应用没有冲突,则提交成功。如果出现问题,事务将被回滚,就好像它从未发生过一样。
这种同时处理多个操作的能力使具有事务能力的数据库引擎真正强大。它是满足ACID 标准的重要组成部分。
MyISAM 是 MySQL 3.0 的原始引擎,它没有任何这些功能,并且在任何INSERT
操作上锁定整个数据库以避免冲突。它就像你想象的那样工作。
在 MySQL 中创建数据库时,您可以选择引擎,但使用 InnoDB 应该是您的默认设置。完全没有理由使用 MyISAM,因为该引擎的任何有趣特性(例如全文索引)都已移植到 InnoDB。
MySql 数据库是否会自动同步大约同时传入的查询?
是的。
可以这样想:不存在同时查询之类的东西。MySQL 总是先执行其中一个,然后执行第二个。(这并不完全正确;服务器远比这复杂。但它为我们用户提供了顺序查询的错觉。)
如果从一个连接发出单个INSERT
查询或单个UPDATE
查询,并从另一个连接发出 a SELECT
,您SELECT
将获得一致的结果。这些结果将反映更改之前或之后的数据状态,具体取决于哪个查询先进行。
你甚至可以做这样的事情(读-修改-写操作)并保持一致性。
UPDATE table
SET update_count = update_count + 1,
update_time = NOW()
WHERE id = something
如果您必须像一个一样执行多个INSERT
或UPDATE
操作,则需要使用 InnoDB 引擎,并且需要使用事务。事务将SELECT
在进行时阻止操作。教您使用事务超出了 Stack Overflow 答案的范围。