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