Потік досить старий, щоб поділитися своїми двома копійками щодо тестів вище, проведених @Frans
З'єднання 1
BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;
З'єднання 2
BEGIN;
SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;
Одночасна транзакція 2 буде заблокована напевно, але причина НЕ в тому, що транзакція 1 утримує блокування на всій таблиці. Далі пояснюється, що сталося за лаштунками:
Перш за все, за замовчуванням рівень ізоляції механізму зберігання InnoDB - Repeatable Read. В цьому випадку,
1- Коли стовпець, що використовується там, де умова не індексується (як у випадку вище):
Механізм зобов'язаний виконати повне сканування таблиці, щоб відфільтрувати записи, що не відповідають критеріям. КОЖНИЙ РЯД, який було відскановано, заблоковано в першу чергу. MySQL може звільнити блокування для тих записів, які згодом не відповідають пункту where. Це оптимізація продуктивності, однак така поведінка порушує обмеження 2PL.
Коли транзакція 2 починається, як пояснювалося, їй потрібно отримати замок X для кожного отриманого рядка, хоча існує лише один запис (id = 2), що відповідає реченню where. Врешті-решт транзакція 2 буде чекати блокування X першого рядка (id = 1), доки транзакція 1 не здійснить або не відкатить.
2- Коли стовпець, що використовується в де умова, є первинним індексом
Заблоковано лише запис індексу, що відповідає критеріям. Тому в коментарях хтось говорить, що деякі тести не блокуються.
3 - Коли стовпець, що використовується в де умова, є індексом, але не унікальним
Цей випадок складніший. 1) Запис індексу заблоковано. 2) Один замок X прикріплений до відповідного первинного індексу. 3) До неіснуючих записів безпосередньо перед записом та після нього, що відповідає критеріям пошуку, прикріплені два зазори.
all Records it has to SCAN TO FIND the SINGLE RECORDбуло б настільки жахливим дурним, що я дійсно сумніваюся, що MySQL працює так. Подумайте про алгоритм у пошуковій системі MySQL - коли він бачить якийсь рядок і знає, що це не той рядок, який вам потрібен, чому б на Землі витрачати додатковий час, щоб встановити блокування ?! Я пропоную вам не приймати відповідь, щоб інші люди MySQL могли коментувати це