3

我目前正在构建一个庞大的数据库,其中包含许多事务。(插入、更新、选择)与 MySQL MyISAM

我正在考虑对敏感表使用 LOCK TABLE AND UNLOCK TABLE。如果出现以下情况会发生什么:

用户 A 有一个更新过程(首先锁定表),但仍在进行中时,用户 B 和用户 C 试图访问同一个表和行(无论是更新/选择)。

  • B 和 C 会立即得到关于表被锁定的 SQL 错误吗?
  • MySQL在返回错误之前是否有锁定超时?如果存在锁定超时,如何检查服务器中的锁定超时?
  • 有比锁定表格更好的解决方案吗?我们正在考虑为作业队列创建一个表。但我认为表现会非常糟糕。

这张表真的很敏感,如果我不能阻止它会搞砸的

感谢您的回答

4

3 回答 3

3

MyISAM如果您想更有效地扩展并处理并发问题,请不要使用存储引擎。InnoDB选择not 的主要原因MyISAMMyISAM使用每表锁(这将成为性能瓶颈),而InnoDB实现MVCC(多版本并发控制)意味着在行级别锁定。

MyISAM也不支持事务,在表损坏的情况下需要手动修复。

于 2013-10-11T10:19:50.543 回答
1

回答您的问题 - B & C 被阻止,直到超时到期。我现在找不到 MyISAM 的超时设置——它是在 InnoDB 的 mysqld.conf 中设置的。

正如其他人所说 - 如果您需要事务支持,InnoDB 是一个更好的引擎。

但是,请考虑您是否真的需要锁。它们会在性能方面造成不可预测的瓶颈,尤其是在具有许多并发用户的系统中。虽然表级锁不应该导致可怕的死锁场景,但表级锁意味着任何时候只有一个进程可以使用该表。如果每个数据库操作需要 1 秒(在大型数据库中并非不合理),系统的并发用户超过 2 个就会注意到性能下降;10 个并发用户会看到系统变得非常慢,尤其是当您必须跨多个表连接时。

在大多数情况下,事务是一个更好的解决方案。

于 2013-10-11T10:51:01.337 回答
0

要通过事务支持获得良好的性能,最好使用 INNODB 而不是 MISAM。INNODB 适用于行级锁定。同时多个用户可以访问该表以更改不同的记录。

在此处阅读 INNODB 锁定机制

阅读此处了解锁定问题

于 2013-10-11T10:34:07.810 回答