MySQL锁定系统

3

我正在构建一个大规模的数据库,其中有许多事务操作(插入,更新,选择),使用的是MySQL MyISAM。

我正在考虑在敏感表上使用锁定和解锁表。如果:

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

  • B和C是否会立即收到关于表被锁定的SQL错误?
  • MySQL在返回错误前是否有锁定超时时间?如果有锁定超时时间,如何检查服务器上的超时时间?
  • 有没有比锁定表更好的解决方案?我们正在考虑为任务队列创建一个表。但我认为性能会非常低下。

这个表非常敏感,如果我不能防止这种情况发生,它将混乱不堪。

感谢您的回答。


1
听起来你最好使用InnoDB引擎,因为它支持事务和行级锁定。 - Stephan
MyISAM 无法进行事务处理。我建议您使用MariaDB或Percona,它们更加稳定,并且默认具有更好的锁定功能。您不必进行任何手动锁定。您的备份可能性始终是“backlog”和复制。 - Daniel W.
你需要了解引擎类型及其特点,还是想检查根据你的规格最佳实现作业队列的方法? - N.B.
3个回答

3
如果您想更有效地扩展和处理并发问题,请勿使用MyISAM存储引擎。选择InnoDB而不是MyISAM的主要原因在于MyISAM使用每个表锁定(这将成为性能瓶颈),而InnoDB实现了MVCC(多版本并发控制),这意味着以行级别进行锁定。
此外,MyISAM不支持事务,并且在表损坏的情况下需要手动修复。

1
回答您的问题 - 直到超时到期,B 和 C 都会被阻止。我现在找不到 MyISAM 的超时设置 - 对于 InnoDB,它是在 mysqld.conf 中设置的。
正如其他人所说 - 如果需要事务支持,则 InnoDB 是更好的引擎。
然而,请考虑您是否真的需要锁。它们会在性能方面创建不可预测的瓶颈,特别是在具有许多并发用户的系统中。虽然表级锁不应导致可怕的死锁情况,但表级锁意味着任何时候只有一个进程可以使用该表;如果每个数据库操作需要 1 秒钟(在庞大的数据库中不合理),那么超过 2 个并发用户将会注意到性能下降;如果必须跨多个表联接,则 10 个并发用户将看到系统变得非常缓慢。
在大多数情况下,事务是更好的解决方案。

嗨Neville,感谢你的回答。 "B&C被阻止"是指什么?它会排队(A将运行,然后是B和C)吗?还是交易将被阻止并返回错误? - Yansen Tan
他们会等待直到锁被释放。对于MyISAM来说,似乎没有超时设置,所以他们可能会永远等下去... - Neville Kuyt

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接