У меня тупик, и я пытаюсь выяснить причину этого.
Вопрос можно свести к такому:
Таблица:
create table testdl (id int auto_increment, c int, primary key (id), key idx_c (c));
Уровень изоляции - повторяемое считывание
(Tx1): begin; delete from testdl where c = 1000; -- nothing is deleted coz the table is empty
(Tx2): begin; insert into testdl (c) values (?);
Каким бы ни было значение в Tx2, оно зависает. Таким образом, это в основном означает, что Tx1 удерживает разрыв во всем диапазоне (-∞, + ∞), когда delete from testdl where c = 1000
не может найти совпадение, верно ?.
Итак, мой вопрос: это намеренно? Какой в этом смысл?
Обновлять:
Допустим, у нас уже есть запись в testdl
:
+----+------+
| id | c |
+----+------+
| 1 | 1000 |
+----+------+
Дело 1:
(Tx1): select * from testdl where c = 500 for update; -- c = 500 not exists
(TX2): insert into testdl (c) values (?);
В этом случае можно вставить любое значение> = 1000, поэтому Tx1 блокирует пробел (-∞, 1000)
Опять же, необходима ли блокировка (-∞, 1000)? В чем причина этого?
delete from testdl where c = 1000
не находит совпадения - person Dean Winchester   schedule 02.03.2017select * from testdl where c = 500 for update
не соответствует записи, я не могу вставить запись сc = 100
. В конце концов, меня выбралиc = 500 for update
, а неc < 500
. Что будет не так, если разрешена вставка записи сc = 100
? Для этого есть какая-то причина? Или, может быть, это просто реализация, ничего плохого не случится? - person Dean Winchester   schedule 03.03.2017select * from testdl where c > 500 for update
, для меня имеет смысл запретить все одновременные записи сc > 500
, пока я не закончу. Но если яselect * from testdl where c = 500 for update
, какой вред может быть, если другая транзакция вставит запись сc = 100
? - person Dean Winchester   schedule 03.03.2017