172 похожих чатов

Всем привет, если я делаю update table set field = 0

where field = 10
, то все строки подходящие под условие никто не может изменить до окончания операции?

16 ответов

31 просмотр

В некотором смысле да, но в некоторых случаях что понимается под "началом" и "окончанием" операцыи можэт оказаться совсем не теми моментами, когда она началась или закончилась по времени.

Конечно, может. "Магически" (мгновенно и одновременно) СУБД записи блокировать не может. Вопрос может быть в том, что с этими транзакциями будет потом (это зависит от их уровней изоляции).

Maus-Grau Автор вопроса
Ilya Anfimov
В некотором смысле да, но в некоторых случаях что ...

Если последовательность такая: 1. Выбрать все подходящее под условие 2. Заблокировать все с п.1. 3. Обновить. 4. Разблокировать Тогда почему возникает deadlock, ведь строки заблочены.

Maus Grau
Если последовательность такая: 1. Выбрать все подх...

На самом деле в п.3 и 4 они возникать, конечно, не должны. Но это только если всё сделано правильно (обновляются только заблокированные записи и т.п.). А в п.1 -- ну, дедлок возникает когда две (или более) транзакцый начинают ждать блокировок друг друга чтобы продолжыть блокирование. Ничего в таком подходе не препятствует этому состоянию.

Maus-Grau Автор вопроса
Ilya Anfimov
Почему бы ему не возникать.

1ая Транзакция заблокировала все строки которые хочет обновить, следовательно вторая не может заблокировать строки если оно пересекаются. Просто обычно объясняют дедлок так: 1 транзакция заблочила строка 1, вторая строку 2 и потом 1ая хочет изменить строку 2, а 2ая строку 1. Но тогда зачем они держат лок если они обновили строку и могут отпустить блокировку тем самым давая пройти 2ой транзакции.

Maus Grau
1ая Транзакция заблокировала все строки которые хо...

Я совершэнно непонимаю, что вы кому и зачем объясняете и на каких примерах. Если вас интересует конкретный пример -- ну, приведите воспроиводимый.

Maus-Grau Автор вопроса
Ilya Anfimov
На самом деле в п.3 и 4 они возникать, конечно, не...

В моей последовательности я имею в виду под 2 пунктом: Заблокировать все строки из выборки, если на данных строках уже есть блокировка, то ждать и повторить попытку

Maus Grau
В моей последовательности я имею в виду под 2 пунк...

Повторюсь, понимать вас достаточно трудно и субботним вечером в курилке я не планирую напрягаться. Если есть воспроизводимый пример -- приводите его.

Maus-Grau Автор вопроса
Ilya Anfimov
Я совершэнно непонимаю, что вы кому и зачем объясн...

Я хочу понять почему возникает дедлок, например тут https://www.cybertec-postgresql.com/en/postgresql-understanding-deadlocks/ первый пример, ведь на шаге 2 он может отпустить лок с строки с id = 1 и ждать строку с id = 2 не держа лок на id = 1

Maus Grau
Я хочу понять почему возникает дедлок, например ту...

С чего бы ему отпускать строку с id=1? Там транзакцыя, транзакцыи должны быть изолированы -- то есть вторая должна или дождаться завершэния первой, и получить всё ужэ после её изменений, или читать всё как было до начала первой.

Maus-Grau Автор вопроса
Ilya Anfimov
С чего бы ему отпускать строку с id=1? Там транзак...

Т.е. когда идет update он поочередно блокирует каждую встретившуюся строку подходящую под условие и держит до конца?

Maus-Grau Автор вопроса
Ilya Anfimov
Да.

Спасибо

Maus Grau
Если последовательность такая: 1. Выбрать все подх...

могу предложить что лочится не строка а страница целиком.

Ildar Garaev
могу предложить что лочится не строка а страница ц...

В других серверах -- бывает. Для этой конференцыи это ошыбочное предположэние.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта