2013-10-11 35 views
3

我目前正在建立一个庞大规模的数据库,其中有许多交易。 (插入,更新,选择)使用MySQL MyISAMMySQL锁定系统

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

用户A有一个更新过程(首先锁定表),并且在过程中,用户B和用户C试图访问同一个表和行(不管它是更新/选择)。

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

该表确实是敏感的,它会搞砸了,如果我不能阻止这个

谢谢您的回答

+1

听起来对你来说,你最好使用'InnoDB'引擎,因为它支持事务和行级锁定 – Stephan

+0

MyISAM不能做事务。我建议你使用MariaDB或Percona,它更加稳定,默认情况下具有更好的锁定功能。您不必进行任何手动锁定。您的备份可能性始终是'backlog'和复制。 – DanFromGermany

+0

您是否需要了解引擎类型及其怪癖,或者您是否想要根据您的规范检查实施作业队列的最佳方法? –

回答

1

要回答你的问题 - B & C被阻塞,直到超时。我现在找不到MyISAM的超时设置 - 它在InnoDB的mysqld.conf中设置。

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

然而,考虑你是否真的需要锁。它们在性能上造成不可预知的瓶颈,尤其是在具有许多并发用户的系统中。虽然表级锁不应导致可怕的deadlock方案,但表级锁意味着只有一个进程可以随时使用该表;如果每个数据库操作需要1秒(在大型数据库中不是不合理),则系统中超过2个并发用户会注意到性能下降; 10个并发用户会看到系统变得非常慢,特别是如果您必须跨多个表加入。

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

+0

嗨内维尔,谢谢你的回答。 “B&C被封锁”是指什么?它会在队列中(A将运行,然后B和C)?或者交易将被阻止并返回错误? –

+0

他们将等待锁定释放。 MyISAM似乎没有超时设置,所以他们可以永远等待... –

3

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

另外MyISAM不支持交易,并且需要手动修复表格结果。