Это зависит не только от задействованной блокировки, но и от уровня изоляции, который использует блокировку для обеспечения изоляции транзакции, как определено стандартами ACID. InnoDB использует не только блокировку, но и мультиверсионность строк для ускорения транзакций.
На уровне изоляции serializable
при обновлении будет использоваться блокировка чтения, поэтому селекту придется ждать завершения первой транзакции. На более низких уровнях изоляции, однако, блокировка будет записана, а выборки не будут заблокированы. В repeatable read
и read committed
он будет сканировать журнал отката, чтобы получить предыдущее значение записи, если оно будет обновлено, а в read uncommitted
in вернет текущее значение.
Разница между блокировкой на уровне таблицы и блокировкой на уровне строки заключается в том, что у вас есть 2 транзакции, которые выполняют запрос на обновление. При блокировке на уровне таблицы 2-й должен ждать первого, так как вся таблица заблокирована. При блокировке на уровне строк будут блокироваться только строки, которые соответствуют предложению where * (а также некоторые пробелы между ними, но это другая тема), что означает, что различные транзакции могут обновлять разные части таблицы без необходимости ждать друг для друга.
* при условии, что существует индекс, охватывающий предложение where