powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
15 сообщений из 15, страница 1 из 1
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40085967
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
-- session1
set session transaction isolation level read committed;
set autocommit = 0;

create table t (id int primary key);

insert into t(id) values (1);
commit;
select * from t where id = 1 for update;

-- session2
set session transaction isolation level read committed;
set autocommit = 0;

insert into t(id) values (1); -- зависает до тех пор, пока первая сессия не отпустит блокировку



Это баг или фича?

Оракл и постгре в этом случае сразу ругаются, что нарушен primary key constraint, что на мой взгляд более логично.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40085968
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MySql 8.0.25
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40085975
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Псевдомизантроп,

А вдруг первая сессия захочет удалить эту запись?
Транзакция не закрыта, что произойдет с записью id = 1 - неизвестно.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40085976
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Псевдомизантроп,

А вдруг первая сессия захочет удалить эту запись?
Транзакция не закрыта, что произойдет с записью id = 1 - неизвестно.


Вот когда первая сессия удалит эту запись, тогда ожидание будет вполне логично - кстати, именно так работает в оракле.
А если запись не удалена и нода всё ещё присутствует в индексе - чего висеть то? Почему нельзя сразу отдать dupliacte entry - я же не зря выставляю read committed.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086031
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так она ещё не committed.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086035
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Так она ещё не committed.


Что значит не committed?
в первой сессии после инсерта идёт коммит.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086227
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Псевдомизантроп
в первой сессии после инсерта идёт коммит.

А после select for update - нет. Никто же не в состоянии предугадать этот твой последующий update, который может поменять 1 на 2, например.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086237
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Псевдомизантроп
в первой сессии после инсерта идёт коммит.

А после select for update - нет. Никто же не в состоянии предугадать этот твой последующий update, который может поменять 1 на 2, например.


А зачем что-то предугадывать?
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086337
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Псевдомизантроп,
Код: sql
1.
2.
3.
select * from t where id = 1 for update;
/* открывает транзакцию и в Оракл
для того и сделан  FOR UPDATE чтобы затем сделать UPDATE и гарантировать что никто не тронет запись до COMMIT */

не баг и не фича, все строго док-ции
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086344
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
Псевдомизантроп,
Код: sql
1.
2.
3.
select * from t where id = 1 for update;
/* открывает транзакцию и в Оракл
для того и сделан  FOR UPDATE чтобы затем сделать UPDATE и гарантировать что никто не тронет запись до COMMIT */

не баг и не фича, все строго док-ции


insert в другой сессии ни физически, ни теоретически не может тронуть эту запись.

Ещё раз, оракл (и постгре) в этой ситуации действуют ровно настолько, насколько требуется в данный конкретный момент времени, безо всяких гаданий и предсказаний, а именно:

1) select for update в первой сессии не блокирует попытку инсерта во второй. У нас есть первичный ключ, который в данный момент уже содержит значение, и это значение никто пока даже ещё не попытался удалить или изменить. Вторая сессия получит primary key violation сразу, безо всяких ожиданий;

2) а вот если в первой сессии последует удаление, или изменение первичного ключа (причём не важно, был ли вообще перед этим select for update), тогда, конечно, попытка инсерта будет заблокирована до окочания транзакции в первой сессии - чтобы не нарушить primary key constraint.

Мой вопрос был насчёт п. 1 - MySql зачем-то накладывает блокировку там, где она не нужна.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086347
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Псевдомизантроп
MySql зачем-то накладывает блокировку там, где она не нужна.


уточнение - блокировка нужна, но она не должна блокировать заведомо невалидный инсерт
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086447
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМой вопрос был насчёт п. 1 - MySql зачем-то накладывает блокировку там, где она не нужна.
а почему вы уверены что это блокировка именно данных?
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086461
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow
авторМой вопрос был насчёт п. 1 - MySql зачем-то накладывает блокировку там, где она не нужна.

а почему вы уверены что это блокировка именно данных?

Я не в курсе природы этой блокировки, так как с MySql никогда не работал и с внутренностями не знаком.

Мне понадобилось перенести одну функциональность с оракла, обнаружил разницу в поведении.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086465
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Псевдомизантроп
она не должна блокировать заведомо невалидный инсерт

Может быть. Но твой-то insert совсем не "заведомо невалидный". Измени id существующей записи и опаньки, он пройдёт как по маслу. Именно из-за read committed.
...
Рейтинг: 0 / 0
Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
    #40086479
Псевдомизантроп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Псевдомизантроп
она не должна блокировать заведомо невалидный инсерт

Может быть. Но твой-то insert совсем не "заведомо невалидный". Измени id существующей записи и опаньки, он пройдёт как по маслу. Именно из-за read committed.


После изменения id он не должен пройти как по маслу. В этом случае он должен подвиснуть в ожидании окончания транзакции, с этим сценарием вопросов нет.

А вот до изменения id смысла висеть нету - логичнее сразу отдать primary key violation.

Оракл и постгре умеют отличать эти два состояния, а My Sql видимо нет.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вставка дубликакта зависает на блокировке вместо Duplicate entry exception (READ COMMITTED
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]