Php MySQL锁定系统

Php MySQL锁定系统,php,mysql,Php,Mysql,我目前正在建立一个庞大的数据库,其中包含许多事务。(插入、更新、选择)使用MySQL MyISAM 我正在考虑对敏感表使用锁表和解锁表。如果: 用户A有一个更新进程(首先锁定表),在进程中,用户B和用户C试图访问同一个表和行(无论是更新还是选择) B和C会立即得到关于表被锁定的SQL错误吗 MySQL在返回错误之前是否有锁定超时?如果存在锁定超时,如何检查服务器中的锁定超时 还有比锁定表更好的解决方案吗?我们正在考虑为作业队列创建一个表。但我认为演出会非常糟糕 这张桌子真的很敏感,如果我不能

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

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

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

  • B和C会立即得到关于表被锁定的SQL错误吗
  • MySQL在返回错误之前是否有锁定超时?如果存在锁定超时,如何检查服务器中的锁定超时
  • 还有比锁定表更好的解决方案吗?我们正在考虑为作业队列创建一个表。但我认为演出会非常糟糕
这张桌子真的很敏感,如果我不能阻止的话,它会搞砸的


感谢您的回答

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


另外,
MyISAM
不支持事务,需要在表出现故障时手动修复。

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


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

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

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


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

在我看来,您最好使用
InnoDB
引擎,因为它支持事务和行级锁定MyISAM不能执行事务。我建议您使用MariaDB或Percona,这在默认情况下更稳定,并且具有更好的锁定功能。您不必进行任何手动锁定。您的备份可能性总是
积压工作和复制。您需要了解引擎类型及其怪癖吗,还是想根据您的规范检查实现作业队列的最佳方法?嗨,Neville,谢谢您的回答。“B&C被封锁”指的是什么?它是否在队列中(A将运行,然后B和C)?或者事务将被阻止并返回错误?他们将等待锁释放。MyISAM似乎没有超时设置,所以他们可以永远等待。。。