我有一个快速的问题,我似乎找不到网上,不确定我用的是正确的措辞或没有。mysql数据库是否自动同步查询或几乎同时传入?例如,如果我在另一个连接发送一个查询以从数据库中选择某个内容的同时发送一个查询以将某个内容插入数据库,那么mysql是否会在插入时自动锁定数据库,然后在插入完成时解锁,从而允许select查询访问该数据库?谢谢
uyhoqukh1#
理解像innodb这样的现代数据库引擎如何工作的关键是多版本并发控制(mvcc)。这就是并发操作如何并行运行,然后在完全提交时协调到数据库的一致“视图”中。如果你曾经使用过git,你就知道如何并行地对同一个基础进行多个更新,但是只要它们能够干净地合并在一起,就不会有冲突。数据库也是这样工作的,在这里您可以开始一个事务,应用一系列操作,然后提交它。如果这些应用没有冲突,那么提交是成功的。如果出现问题,事务将回滚,就好像从未发生过一样。这种同时处理多个操作的能力使得具有事务功能的数据库引擎非常强大。它是达到酸性标准所必需的重要成分。myisam是mysql 3.0的原始引擎,它没有任何这些特性,并且将整个数据库锁定在任何位置 INSERT 避免冲突的操作。就像你想象的那样。在mysql中创建数据库时,您可以选择引擎,但是使用innodb应该是您的默认选择。实际上根本没有理由使用myisam,因为该引擎的任何有趣特性(例如全文索引)都已移植到innodb。
INSERT
gkl3eglg2#
mysql数据库是否自动同步几乎同时传入的查询?对。这样想吧:没有同时查询这回事。mysql总是先执行其中一个,然后执行第二个(这不完全是真的;服务器远比这复杂。但它给美国用户提供了一种强烈的顺序查询错觉。)如果,从一个连接发出一个 INSERT 查询或单个 UPDATE 查询,并从另一个连接发出 SELECT ,您的 SELECT 会得到一致的结果。这些结果将反映数据在更改之前或之后的状态,具体取决于哪个查询先进行。你甚至可以这样做(读修改写操作)并保持一致性。
UPDATE
SELECT
UPDATE table SET update_count = update_count + 1, update_time = NOW() WHERE id = something
如果你必须做几个 INSERT 或者 UPDATE 操作就像它们是一个一样,您需要使用innodb引擎,并且需要使用事务。交易将被阻止 SELECT 正在进行的操作。教您使用事务超出了堆栈溢出答案的范围。
2条答案
按热度按时间uyhoqukh1#
理解像innodb这样的现代数据库引擎如何工作的关键是多版本并发控制(mvcc)。这就是并发操作如何并行运行,然后在完全提交时协调到数据库的一致“视图”中。
如果你曾经使用过git,你就知道如何并行地对同一个基础进行多个更新,但是只要它们能够干净地合并在一起,就不会有冲突。数据库也是这样工作的,在这里您可以开始一个事务,应用一系列操作,然后提交它。如果这些应用没有冲突,那么提交是成功的。如果出现问题,事务将回滚,就好像从未发生过一样。
这种同时处理多个操作的能力使得具有事务功能的数据库引擎非常强大。它是达到酸性标准所必需的重要成分。
myisam是mysql 3.0的原始引擎,它没有任何这些特性,并且将整个数据库锁定在任何位置
INSERT
避免冲突的操作。就像你想象的那样。在mysql中创建数据库时,您可以选择引擎,但是使用innodb应该是您的默认选择。实际上根本没有理由使用myisam,因为该引擎的任何有趣特性(例如全文索引)都已移植到innodb。
gkl3eglg2#
mysql数据库是否自动同步几乎同时传入的查询?
对。
这样想吧:没有同时查询这回事。mysql总是先执行其中一个,然后执行第二个(这不完全是真的;服务器远比这复杂。但它给美国用户提供了一种强烈的顺序查询错觉。)
如果,从一个连接发出一个
INSERT
查询或单个UPDATE
查询,并从另一个连接发出SELECT
,您的SELECT
会得到一致的结果。这些结果将反映数据在更改之前或之后的状态,具体取决于哪个查询先进行。你甚至可以这样做(读修改写操作)并保持一致性。
如果你必须做几个
INSERT
或者UPDATE
操作就像它们是一个一样,您需要使用innodb引擎,并且需要使用事务。交易将被阻止SELECT
正在进行的操作。教您使用事务超出了堆栈溢出答案的范围。