ТРАНЗАКЦИИ И БЛОКИРОВКИ ПРОСТЫМ ЯЗЫКОМ

Записи реальных собесов и полезную инфу для подготовки можно найти на бусти boosty.to/vanyaio
Пиши мне любой вопрос в телегу: vanyaio
0:00 Вступление
1:10 Что такое транзакции
3:00 Пример использования
5:10 Аномалии
8:50 Неповторяющееся и фантомное чтение
11:33 Уровни изоляций
12:36 Repeatable read
16:37 Аномалии на repeatable read
18:56 Блокировки
21:00 Классификация аномалий на repeatable read
21:48 Блокировки на read commited уровне
23:32 Дефолтные блокировки и deadlock
25:15 Когда блокировки не спасают
28:10 Serializable

Пікірлер: 66

  • @ivangolang
    @ivangolang Жыл бұрын

    Записи реальных собесов и полезную инфу для подготовки можно найти на бусти boosty.to/vanyaio Офф. дока по теме: www.postgresql.org/docs/current/transaction-iso.html www.postgresql.org/docs/current/explicit-locking.html Много хороших примеров в книжках: postgrespro.ru/education/books/internals глава про изоляцию Книжка с кабаном - designing data-intensive applications - глава 7 про транзакции

  • @adwawdwad2499
    @adwawdwad249911 ай бұрын

    Read uncommitted - это не аномалия, а уровень изоляция. Dirty read - это аномалия.

  • @flower-py
    @flower-py8 ай бұрын

    Ты очень крутой, спасибо. Читал книжку с кабанчиком, и твоё видео гораздо нагляднее, особенно с примером про докторов. Счастья и здоровья тебе на всю нафиг жизнь ❤

  • @user-ir4vd5yk4x
    @user-ir4vd5yk4x9 ай бұрын

    Ух огромное спасибо) отличный ролик. очень доступно объяснил

  • @alex-0x6b
    @alex-0x6b8 ай бұрын

    Про Serializable для меня вообще было открытием. Спасибо!

  • @user-ge6pt5lp9u
    @user-ge6pt5lp9u18 күн бұрын

    Пересмотрел дважды, пробежался по всем примерам руками, бро, обожаю тебя😅

  • @chefirka.
    @chefirka. Жыл бұрын

    Очень интересно и полезно, спасибо большое!!!

  • @gera5458
    @gera5458 Жыл бұрын

    Очень годно, продолжай в том же духе!

  • @vlad_issslove
    @vlad_issslove9 ай бұрын

    Крутой тутор! Случайно наткнулся на канал, коммент для продвижения)

  • @user-wb1ln3um3g
    @user-wb1ln3um3gАй бұрын

    Как же жить стало проще когда узнал про SERIALIZABLE ISOLATION Успехов ))

  • @user-uo4ff6qb5r
    @user-uo4ff6qb5r Жыл бұрын

    очень полезный видос, спасибо!

  • @sergeyplotnikov4303
    @sergeyplotnikov43033 ай бұрын

    Супер! Большое спасибо! Очень понятно с отличными наглядными примерами!

  • @eugenenazirov
    @eugenenazirov5 ай бұрын

    Идеальное видео с качественными примерами. Красавчик!

  • @VoroN93Rus
    @VoroN93Rus11 ай бұрын

    Спасибо, интересно. Единственное не рассказал как базу на работе локнул 😅

  • @ZeBatua
    @ZeBatua2 ай бұрын

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

  • @Angelisme1995
    @Angelisme19953 ай бұрын

    Спасибо! Очень классно и наглядно показано

  • @MrSunchezz
    @MrSunchezz3 ай бұрын

    Спасибо! Весьма полезно.

  • @cfirfbbg4344
    @cfirfbbg43443 ай бұрын

    Лайк за Хана. Какой же кайф

  • @borymskyi
    @borymskyi Жыл бұрын

    Годный осмотр транзакций. Контент зайдет для всех кто пишет бек, неважно на каком языке. Особенно круто что прошёлся по локам, кстати советую ещё зрителям посмотреть какой то более конкретный пример с локами, например как обновляется одна строка в бд при конкурентном доступе от Реста и от Брокера. И почему в такой ситуации круто подходит Лок а не другие способы по типу siriazible

  • @oksigenoksi
    @oksigenoksi5 ай бұрын

    Это лучший материал про уровни изоляции и аномалии! Респект!

  • @egorzrobko8053
    @egorzrobko80538 ай бұрын

    Топовое видео, спасибо большое

  • @SemyonF89
    @SemyonF897 ай бұрын

    Это база(с) Спасибо. Исчерпывающий гайд.

  • @vova_dev
    @vova_devАй бұрын

    Классно, спасибо!

  • @user-yr9rq7we2n
    @user-yr9rq7we2n4 ай бұрын

    Толково изложено! В MySQL лост апдейты тоже (как и в постгресс) невозможны на уровне "repeatable read" ?

  • @userqh67vey6
    @userqh67vey68 ай бұрын

    Полезное видео. Лайк за видос.

  • @p0isonspear
    @p0isonspear11 күн бұрын

    лост апдейт попадает под класс неповторяющегося чтения? Ведь когда делается апдейт, значение читается, над ним производится операция, новое значение записывается

  • @bilorus-marschak
    @bilorus-marschak Жыл бұрын

    Топ контент!

  • @llwebstylell242
    @llwebstylell242Ай бұрын

    Снимай видосы, интересный материал

  • @yashkevich8164
    @yashkevich816410 ай бұрын

    Самое смешное что решать эти проблемы требуется только в определенных предметных областях в программировании. А спрашивают везде, даже когда сами все используют по умолчанию настройки. Не только лишь всем понадобится решать такие проблемы, а ограниченному кругу разработчиков. Тоже самое касается про репликацию и шардировние, никто не реализовывал, но спрашивает

  • @javalexiy
    @javalexiyАй бұрын

    Иван, поясни пожалуйста про ретрай запросов? Можешь раскрыть тему, как это делается?

  • @maximderevnin6646
    @maximderevnin6646Ай бұрын

    В последнем примере с serializable можно поставить блокировку на строку из таблицы room по room_id и все будет ок без serializable. Или я не прав?

  • @viktorz1986
    @viktorz19869 ай бұрын

    "Третий день пишу видос, сам не рад, что начал" - здесь улыбнулся. Делаешь ролик на 5 минут - 80 тыщ просмотров, три дня - 300 просмотров и все от бабушки. Посмотрел ролик 3 раза, чтобы тебя поддержать. Хорошее видео.

  • @cintock
    @cintock3 ай бұрын

    В этом видео понятно, для примера баланс как число в таблице хранится. Когда храним финансовую информацию более правильно ее представить в виде истории изменения баланса. То есть приход 100 рублей, списание 5, приход 2. А баланс получать (рассчитывать) как сумму +100 - 5 + 2. Меньше вероятность запортить данные, чем хранить просто как значение в ячейке. И в случае проблем, легче разобраться в причинах и восстановить.

  • @alekseysverbeev2934

    @alekseysverbeev2934

    3 ай бұрын

    я не сталкивался, но делал бы 2 таблицы - одна с логом, другая с агрегирующим значением по этому логу

  • @user-yr9rq7we2n
    @user-yr9rq7we2n4 ай бұрын

    В примере про случай когда блокировки не спасают: если там установить уровень read commited, то вроде как проблема решится. Или нет?

  • @foobarspam8548
    @foobarspam8548 Жыл бұрын

    Лайк за Хана Замая!!!!

  • @palach_666
    @palach_6664 ай бұрын

    Все видео, я хотел дать тебе баночку энергетика)

  • @olgababoshina-rj4us
    @olgababoshina-rj4us Жыл бұрын

    А можно вернуть кринжовую музыку? Это единственное, что мне близко из темы твоего канала😘😘😘😘😘

  • @user-pr5sl7sw8k
    @user-pr5sl7sw8k8 ай бұрын

    Bro, snimau svou treugolky. Spasibo

  • @user-up6vl1wd3i
    @user-up6vl1wd3i11 ай бұрын

    Лайков за Замая...

  • @zicksu2142
    @zicksu21422 ай бұрын

    Иван, спасибо за видео, но его нужно переснимать. В процессе просмотра было несколько неточностей. Одна из них кем-то упоминалась в коментах, что мол read uncommitted это не аномалия, а название изоляции. Про другие не вспомню сейчас, т.к. в несколько заходов смотрю видео. Причиной для того, чтобы перезаписать видос, на мой взгляд, является то, что на 15:10 ты говоришь что изоляция repeatable read избавляет от фантомного чтения. Это не так. Repeatable read имеет самое кричащее название (имхо) и гарантирует (внезапно) то, что чтение строки будет повторятся (но не количество строк). Фантомное чтение - это аномалия которая невозможна только на Serializable уровне. Т.е. если на repeatable read 2-ая транзакция изменит данные в рамках одной строки, то ок (1-ая транзакция их не увидит при повторном чтении, аномалия с неповторяющимся чтением не воспроизводится). Но если 2-ая транзакция изменит количество строк (обновит/удалит), то 1-ая транзакция (при повторном выполнении того же самого селекта) должна увидеть добавленные/удаленные строки. Это и есть фантомное чтение, которое не обеспечивается repeatable read-ом.

  • @ivangolang

    @ivangolang

    2 ай бұрын

    Откуда эта инфа? Офф дока постгреса про phantom read на уровне Repeatable read - Allowed, but not in PG

  • @ivangolang

    @ivangolang

    2 ай бұрын

    Про dirty read / read uncommitted - абсолютно минорный момент как назвать ситуацию, что вы читаете незакоммиченные данные. Коммента достаточно, что я не общепринятый термин случайно сказал.

  • @zicksu2142

    @zicksu2142

    2 ай бұрын

    @@ivangolang да, верно. Прошу прощения. Как-то упустил что видос исключительно про pg, думал в целом так сказать академический подход

  • @sander1614
    @sander161410 ай бұрын

    И что делать, когда транзакция зависла из-за другой неоконченной транзакции?

  • @codebrainy6246

    @codebrainy6246

    3 ай бұрын

    Есть настройка у постгреса скок максимум можно висеть, если время превысится - ролбекнет

  • @YanchikDev
    @YanchikDev3 ай бұрын

    Race condition?

  • @BYGUR
    @BYGUR4 ай бұрын

    Для чего впихивать в одну транзакцию две одинаковых операции на чтение, которые потенциально могут иметь разный результат?

  • @user-lc2sp8hi1d
    @user-lc2sp8hi1d Жыл бұрын

    клад!

  • @user-it3yo1sn6i
    @user-it3yo1sn6i Жыл бұрын

    Может тогда по умолчанию использовать уровень изоляции SERIALIZIBLE? Для чего нам тогда другие уровни изоляций, если они не дают гарантированной защиты от аномалий?

  • @VitaliyZlobin

    @VitaliyZlobin

    11 ай бұрын

    Есть уровни изоляции и аномалии при них. Чем ниже уровень - тем больше аномалий, но и производительность системы выше. Ты, как разработчик, должен решить, какого уровня будет достаточно для твоей системы, без избыточной изоляции. При уровне SERIALIZIBLE говорить о параллелизме не приходится, это прям из названия следует - транзакции просто выполняются последовательно по очереди.

  • @lelelelevv

    @lelelelevv

    11 ай бұрын

    Бывает, когда нам не нужны гарантии выполнения транзакции. А работу нужно ускорить. Например, логи записываешь. Ну не страшно, если что-то там не зафиксируется и на графике подведения итогов будет вместо 159384 записей 159383. Общей картины это не меняет. А записи частые и стоит побыстрее заталкивать. Вот и придуманы способы.

  • @zakharka3938

    @zakharka3938

    3 ай бұрын

    @@VitaliyZlobin Serializable это не про реализацию, а про результат. Более того, уже давно есть реализации serializable которые по мере возможности выполняют транзакции параллельно.

  • @VitaliyZlobin

    @VitaliyZlobin

    3 ай бұрын

    @@zakharka3938 алгоритм с вложенным циклом может выполниться за O(n), однако такой алгоритм имеет сложность O(n^2). Я бы сильно не полагался, на то что там что-то параллельно может выполниться - это подкапотная оптимизация СУБД, а не твоих процессов. И где я писал, что serializable про реализацию?

  • @777ElfenLied777
    @777ElfenLied777 Жыл бұрын

    7:26 - а в чём тут парадокс? Разве транзакция это не инструкция, описывающая что нужно сделать с актуальными данными базы? Я просто новичёк, не знаю нюансов ещё. Или после begin предполагается, что мы должны работать с изначальным состоянием базы, не беря во внимание последующие её апдейты? Просто в примере вроде всё логично: после первой транзакции у Alice на балансе 2, а у Bob 998. Вторая транзакция выполняет инструкцию установить для Alice значение 998, а для Bob прибавить 2 и прибавляет к его текущему значению, которое равно 998.

  • @pyramidhead9692

    @pyramidhead9692

    8 ай бұрын

    А почему актуальными? Коммит второй транзакции не произошел еще. Апдейт бы брался во внимание, если бы изменения эти были в одной транзакции, а не в разных. В postgresql в момент открытия команды begin при уровне repeatable read, строится так называемый "снимок данных". С помощью этого снимка в postgresql как раз и избегается аномалия неповторяющегося чтения.

  • @raphaelpashaev6683
    @raphaelpashaev6683 Жыл бұрын

    лайк с нулевой

  • @Boyarsskiy
    @Boyarsskiy10 ай бұрын

    Все это нужно в очень редких кейсах, но в рф любят почти на каждом собесе поумничать. В реальном мире в 99% случаев это не нужно, так как все решается настройками по-умолчанию. Когда действительно сталкиваешься, то читаешь доку, вспоминаешь, и потом снова забываешь. Это как дедовщина в армии: видать одного замучили на собесе, он поклялся все это выучить, и потом других мучить ))) Был и у меня на работе такой умник. Когда его спрашивали свои же, зачем ты это все спрашиваешь? Он отвечал, что ему интересно понаблюдать как человек мучается и выкручивается. Редкий говнюк был, видать в школе хорошо огребал. Когда же возникали проблемы на бэке, сам же лез в доку и там вкуривал как в той или иной БД транзакционность реализована, какие уровни изоляции поддерживаются и т.д. Ну а так, хорошо всё показал. Молодец!

  • @kibarabara
    @kibarabara Жыл бұрын

    Привет горшочку!

  • @kibarabara

    @kibarabara

    Жыл бұрын

    Да ббббббддддддддддддджжддддддддддддддщджддщдддддддддддддджждщддббббббббббббдддббщддлоо научить ь. Юююююжжюююэээ!э!.!

  • @kibarabara

    @kibarabara

    Жыл бұрын

    Ь. Ьььььллллллллддллл. Ьььььлллллббббббэ

  • @p0isonspear
    @p0isonspear11 күн бұрын

    "на уровне репитабл рид бывает только два типа аномалий" - а как же фантомы? несогласованное чтение разве не попадает под класс фантомы? когда доктор боб хочет уйти он видит двоих на дежурстве. А когда снимается с дежурства, делая апдейт уже видит неявно одного себя. Алиса ведь себя уже закоммитила

  • @user-wb5dh1ps4x
    @user-wb5dh1ps4x3 ай бұрын

    9:29 Обновил всем баланс в 0 что не так?

  • @OREH88
    @OREH884 ай бұрын

    Транзакции Антихайпа

  • @nikolay4362
    @nikolay436211 ай бұрын

    блин, зря сделал += 2, лучше бы везде сделал +998 -998 а то код странно смотрится((

Келесі