表级锁定的好处

Ric*_*mes 7 mysql myisam deadlock locking

MyISAM 存储引擎使用的表级锁定有什么好处?行级锁定有很多好处,比如并发更新和不锁定表的读取。

编辑 人们普遍认为表级锁定可以防止死锁。但是,以并发为代价来防止死锁如何值得呢?

Rol*_*DBA 6

由于 mysql 以这种方式调度执行查询:

  • 写请求(如 UPDATE 和 DELETE)优先于读请求(SELECT)
  • 服务器执行写入FIFO方式(按接收顺序)

有什么好处?

MyISAM 永远不会发生死锁。MySQL 服务器因此可以管理所有争用,显式(锁定表)或隐式(任何 DML)。

只要 MyISAM 表没有删除或更新的记录,并发插入就可以自由发生而不受惩罚。实际上,这将在具有显式读锁的表上包括 INSERT。

对于任何有间隙的表,运行 OPTIMIZE TABLE 将消除这些间隙并再次允许并发插入。

有关更多信息,请阅读“MySQL 5.0 认证学习指南”第 408-412 页第 29.2 节

  • @rickjames myisam 的好处不在于它如何管理更新。最好在非写入密集型情况下使用。 (2认同)

Jon*_*han 5

MyISAM 没有死锁,但在某种程度上,死锁是对表级锁的改进。

当您尝试从锁定的表中插入/更新/删除时,您需要等到它可用或直到超时(默认为 28800 秒)。对于行级锁定引擎上的死锁,如果它不是空闲的并且服务器检测到某种“无限循环”——其中 2 个连接不会放弃一行——那么它会快速拒绝两个连接,并且陷入僵局。

如果您正在尝试解决死锁,我建议您查看以下内容:

  • 死锁是否发生在事务中的错误代码上?是否真的有必要“保持”一行来完成计算并更新它?
  • 您的语句中是否有条件索引?否则 InnoDB 可能确实将整个表标记为等待更新。
  • 可能是服务器上的硬盘没有足够快地提交 InnoDB 更改?服务器上的检查点操作是否会导致 InnoDB 出现问题/停顿?
  • 是因为自动增量锁定吗?如果是这样,也许你应该看看更自由的自动递增 - 设置http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html(也看看行级锁定解决因此类变更引起的部分问题)