Изучаю MySQL, так что в нем я нуб.
В документации к MySQL 5.7 (5.7.12) написано следующее:
14.2.2.7 Locks Set by Different SQL Statements in InnoDB
...
LOCK TABLES sets table locks, but it is the higher MySQL layer above the InnoDB layer that sets these locks. InnoDB is aware of table locks if innodb_table_locks = 1 (the default) and autocommit = 0, and the MySQL layer above InnoDB knows about row-level locks.
Otherwise, InnoDB's automatic deadlock detection cannot detect deadlocks where such table locks are involved. Also, because in this case the higher MySQL layer does not know about row-level locks, it is possible to get a table lock on a table where another session currently has row-level locks.
Из выше сказанного, как я понял, следует что если innodb_table_locks = 1 и autocommit = 0 то только тогда блокировки InnoDB уровня строки и блокировки установленные оператором LOCK TABLES видят друг друга, и иначе не видят и лезут друг на друга.
Но в действительности у меня в (MySQL 5.7.10) выходит не так, все способы блокировки «учитывают» друг друга. Так при autocommit=1 с таблицей блокированно оператором LOCK TABLES сессия все равно замирает при попытке SELECT ... FOR UPDATE, и на оборот. Кроме того такое же точно поведение наблюдается даже при innodb_table_locks = 0.
Например:
Сессия1:
> LOCK TABLES tabtest READ;
Сессия2:
> START TRANSACTION;
> SELECT * FROM tabtest FOR UPDATE;
ждет...
Сессия1:
> LOCK TABLES tabtest WRITE;
Сессия2:
> START TRANSACTION;
> SELECT * FROM tabtest LOCK IN SHARE MODE;
ждет...
Сессия1:
> START TRANSACTION;
> SELECT * FROM tabtest LOCK IN SHARE MODE;
Сессия2:
> LOCK TABLES tabtest WRITE;
ждет...
Почему такое несоответствие написанному в доках, или я чего-то неправильно понял?