首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InnoDB并发读写

InnoDB并发读写
EN

Stack Overflow用户
提问于 2015-05-11 19:42:58
回答 2查看 3.5K关注 0票数 0

我想了解InnoDB如何处理多个同时读/写操作。考虑下面的场景:您正在执行相当密集的批处理编写。任何将传入的读取请求都必须等到批处理写入完成为止。在此期间,还会在表上请求写入请求。因此,到那时,批写已经完成,有多个读取请求和写入请求挂起。innodb将按照什么顺序解析请求。在大多数情况下,我更希望从表中获得最新的结果集。因此,等待写请求将是一种方式,然而,这可能导致读取请求饥饿。所有写入请求都是非更新行请求。我认为更新请求会获得行级锁,而插入请求则需要表级锁。

你能解释一下在InnoDB会发生什么吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 21:48:24

在InnoDB中,INSERTs不使用表锁。(MyISAM是一个不同的故事。)

粗略地说,每次对InnoDB表的读或写都只锁定所需的行。如果一个查询和另一个查询的行之间没有重叠,那么就没有等待。一些使其“粗略”的问题:

  • 有些锁是“间隙”锁。假设INSERTing是两个现有行之间的新行。
  • 共享读锁(同一行)不互相阻塞。
  • eXclusive锁的作用有点像您所描述的那样。

"MVCC“允许多个事务”查看“同一行的不同版本。假设一个事务是我的SELECTing一行,另一个是UPDATEing事务。在这两个事务完成之前,该行实际上有两个版本。在这两个事务都是COMMITedROLLBACKed之后,事情就会被清理干净。

所有这些行级别的锁定和检查都是昂贵的,这可能毫无价值。如果你有几十个连接,它们都会慢下来。在旧版本中,4-8连接是一个实际的限制。在5.7,大约64可以处理。尽管如此,InnoDB每秒仍能处理数千个事务,最终受限于缓慢的磁盘I/O。

“批处理插入”--如果您的意思是INSERT到单个表中,那么最好创建包含100-1000行的单个INSERT语句。这减少了通信、解析、优化和事务开销的开销。它也增加了与读的碰撞风险,但加速(通常)超过碰撞延迟。

确保在每个InnoDB语句之后检查错误。可能会出现死锁。通常,它们由ROLLBACK +重新运行BEGIN...COMMIT来处理。

票数 2
EN

Stack Overflow用户

发布于 2015-05-11 20:03:20

这在很大程度上取决于您是否在事务中进行更新。您还可以设置隔离级别,以便在需要时获得更多的吞吐量。这是一个很好的解释:https://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html

如果您的数据适合,您可以设置较低的隔离级别。我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30176326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档