where field = 10
, то все строки подходящие под условие никто не может изменить до окончания операции?
В некотором смысле да, но в некоторых случаях что понимается под "началом" и "окончанием" операцыи можэт оказаться совсем не теми моментами, когда она началась или закончилась по времени.
Конечно, может. "Магически" (мгновенно и одновременно) СУБД записи блокировать не может. Вопрос может быть в том, что с этими транзакциями будет потом (это зависит от их уровней изоляции).
Если последовательность такая: 1. Выбрать все подходящее под условие 2. Заблокировать все с п.1. 3. Обновить. 4. Разблокировать Тогда почему возникает deadlock, ведь строки заблочены.
Почему бы ему не возникать.
На самом деле в п.3 и 4 они возникать, конечно, не должны. Но это только если всё сделано правильно (обновляются только заблокированные записи и т.п.). А в п.1 -- ну, дедлок возникает когда две (или более) транзакцый начинают ждать блокировок друг друга чтобы продолжыть блокирование. Ничего в таком подходе не препятствует этому состоянию.
1ая Транзакция заблокировала все строки которые хочет обновить, следовательно вторая не может заблокировать строки если оно пересекаются. Просто обычно объясняют дедлок так: 1 транзакция заблочила строка 1, вторая строку 2 и потом 1ая хочет изменить строку 2, а 2ая строку 1. Но тогда зачем они держат лок если они обновили строку и могут отпустить блокировку тем самым давая пройти 2ой транзакции.
Я совершэнно непонимаю, что вы кому и зачем объясняете и на каких примерах. Если вас интересует конкретный пример -- ну, приведите воспроиводимый.
В моей последовательности я имею в виду под 2 пунктом: Заблокировать все строки из выборки, если на данных строках уже есть блокировка, то ждать и повторить попытку
Повторюсь, понимать вас достаточно трудно и субботним вечером в курилке я не планирую напрягаться. Если есть воспроизводимый пример -- приводите его.
Я хочу понять почему возникает дедлок, например тут https://www.cybertec-postgresql.com/en/postgresql-understanding-deadlocks/ первый пример, ведь на шаге 2 он может отпустить лок с строки с id = 1 и ждать строку с id = 2 не держа лок на id = 1
С чего бы ему отпускать строку с id=1? Там транзакцыя, транзакцыи должны быть изолированы -- то есть вторая должна или дождаться завершэния первой, и получить всё ужэ после её изменений, или читать всё как было до начала первой.
Т.е. когда идет update он поочередно блокирует каждую встретившуюся строку подходящую под условие и держит до конца?
Спасибо
могу предложить что лочится не строка а страница целиком.
В других серверах -- бывает. Для этой конференцыи это ошыбочное предположэние.
Обсуждают сегодня