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

Поделиться
HTML-код
  • Опубликовано: 23 дек 2024

Комментарии • 98

  • @ivangolang
    @ivangolang  Год назад +5

    Записи реальных собесов и полезную инфу для подготовки можно найти на бусти boosty.to/vanyaio
    Тренажер по Go для подготовки к собесу: stepik.org/a/206788
    Задачи на горутины и каналы Go для собесов: stepik.org/a/207625
    Офф. дока по теме:
    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
    @adwawdwad2499 Год назад +72

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

  • @deniskanafeev1189
    @deniskanafeev1189 12 дней назад

    Чувак прямо в двух одновременно открытых терминалах с разными транзакциями в реальном времени показывает, что происходит в одной транзакции, и что в другой.
    Красавчик, мне именно такого видоса не хватало, чтобы до конца понять эту тему!

  • @flower-py
    @flower-py Год назад +11

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

  • @cintock
    @cintock 9 месяцев назад +3

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

    • @alekseysverbeev2934
      @alekseysverbeev2934 9 месяцев назад +1

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

  • @dshyryayev
    @dshyryayev 2 месяца назад +1

    Супер! Спасибо за такую качественную инфомрацию! Я тоже помню как долго разбирался с этим, но никогда наглядно не демонстрировал таким образом!
    Молодец автор!

  • @ZeBatua
    @ZeBatua 8 месяцев назад +3

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

    • @kuznet1941
      @kuznet1941 3 месяца назад

      Не все так просто.
      Цитата:
      Для полной гарантии сериализуемости в Postgres Pro применяются предикатные блокировки, то есть блокировки, позволяющие определить, когда запись могла бы повлиять на результат предыдущего чтения параллельной транзакции, если бы эта запись выполнялась сначала. В Postgres Pro эти блокировки не приводят к фактическим блокировкам данных и, следовательно, никоим образом не могут повлечь взаимоблокировки транзакций. Они помогают выявить и отметить зависимости между параллельными транзакциями уровня Serializable, которые в определённых сочетаниях могут приводить к аномалиям сериализации. Транзакции Read Committed или Repeatable Read для обеспечения целостности данных, напротив, должны либо блокировать таблицы целиком, что помешает пользователям обращаться к этим таблицам, либо применять SELECT FOR UPDATE или SELECT FOR SHARE, что не только заблокирует другие транзакции, но и создаст дополнительную нагрузку на диск.

  • @alex-0x6b
    @alex-0x6b Год назад +3

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

  • @ИльяКолосов-и8ъ
    @ИльяКолосов-и8ъ 20 дней назад

    Очень классный видос, пересмотрел пол ютуба перед тем, как найти конфетку)

  • @niknt
    @niknt 2 месяца назад

    Это одно из самых полезных видео по уровням изоляции транзакций. Большое спасибо! 🎉

  • @cfirfbbg4344
    @cfirfbbg4344 9 месяцев назад +4

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

  • @borymskyi
    @borymskyi Год назад +4

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

  • @aleksandrzaremba6520
    @aleksandrzaremba6520 2 месяца назад

    Красавчик! Все по полкам раскидал, были бы такие преподы в универах

  • @КоньЛюдоед-ф6ф
    @КоньЛюдоед-ф6ф Год назад +1

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

  • @sergeyplotnikov4303
    @sergeyplotnikov4303 10 месяцев назад

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

  • @VoroN93Rus
    @VoroN93Rus Год назад +4

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

  • @DmitriyVassilyev
    @DmitriyVassilyev Месяц назад

    Отлично рассказал. Спасибо.

  • @Atikan37
    @Atikan37 5 месяцев назад

    Спасибо большое, все кратко и по делу! Восхитительно!

  • @Angelisme1995
    @Angelisme1995 9 месяцев назад

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

  • @МаксимИващенко-л5о
    @МаксимИващенко-л5о 8 месяцев назад

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

  • @Parsifal-j4j
    @Parsifal-j4j 8 дней назад

    Скажите а версионирование строки под капотом по умолчанию идет ? А оптимистический и пессимистический режимы есть такое?

  • @Hairy89pro
    @Hairy89pro 7 месяцев назад

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

  • @oksigenoksi
    @oksigenoksi 11 месяцев назад

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

  • @eugenenazirovpersonal
    @eugenenazirovpersonal 11 месяцев назад

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

  • @dreamer_vi905
    @dreamer_vi905 5 месяцев назад

    Спасибо за классный контент! Твои 3 дня потраченные на видео прошли не зря)

  • @MrSunchezz
    @MrSunchezz 9 месяцев назад

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

  • @tirsky
    @tirsky 3 дня назад

    Классный канал:)

  • @vlad_issslove
    @vlad_issslove Год назад

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

  • @ЯковЛазоренко
    @ЯковЛазоренко 11 месяцев назад

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

  • @Polik-s2x
    @Polik-s2x 2 месяца назад

    Попробовала сделать запрос с serializable в другой транзакции параллельно но для другого room_id и все равно постгрес ругается на read/write зависимость

  • @egorzrobko8053
    @egorzrobko8053 Год назад

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

  • @viktorz1986
    @viktorz1986 Год назад

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

  • @vova_dev
    @vova_dev 7 месяцев назад

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

  • @gera5458
    @gera5458 Год назад

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

  • @sugukha
    @sugukha Месяц назад

    услышал подкрадули, подписался)

  • @javalexiy
    @javalexiy 8 месяцев назад

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

  • @peteris6992
    @peteris6992 4 месяца назад

    Спасибо тебе, Кристиан Бэйл

  • @SemyonF89
    @SemyonF89 Год назад

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

  • @p0isonspear
    @p0isonspear 6 месяцев назад

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

  • @bobhutchinson3638
    @bobhutchinson3638 4 месяца назад

    это лучшее объяснение

  • @userqh67vey6
    @userqh67vey6 Год назад

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

  • @maximderevnin6646
    @maximderevnin6646 7 месяцев назад

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

  • @ЯковЛазоренко
    @ЯковЛазоренко 11 месяцев назад

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

  • @НиколайПлегунов
    @НиколайПлегунов 4 месяца назад

    Не понял в seriaizable , ты говоришь что может даже не существует строки для блокировки. Но утаблицы есть room id (остальные понятно nil), и по этой же room id оно понимает что что-то происходит и включает блокировку. То есть это происходит именно по всей колонке, тогда можно сказать что вся таблица блокируется? Или если действительно пустая страница, я создам в нескольких окнах новые данные, как распрнделяться id новых записей?
    Спасибо за видео!

  • @bobhutchinson3638
    @bobhutchinson3638 4 месяца назад

    шикарный пример

  • @cheapdramas313
    @cheapdramas313 3 месяца назад

    может я не прав, но как мне кажется что для ситуации на 21:52 не нужна блокировка совсем, так как по логике прога увидит сразу что остался один врач, и роллбекнет транзакцию

  • @chefirka.
    @chefirka. Год назад

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

  • @yashkevich8164
    @yashkevich8164 Год назад +7

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

    • @kuznet1941
      @kuznet1941 3 месяца назад

      Причем это не только про базу данных.

  • @Иван-д1д2б
    @Иван-д1д2б Год назад

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

  • @andreikhotko5206
    @andreikhotko5206 2 месяца назад

    Примеры транзакций хорошие, и тема классная, спасибо! Хотел бы немного дать рекомендаций, что можно тут улучшить.
    1) Хотелось бы с первых минут знать, на примере какой СУБД рассматриваются транзакции, прежде чем приступать к примерам запросов.
    2) Как-то очень абстрактно рассказываешь, не расскрывая деталей. Пишу после просмотра первых 5 минут. Про изолированность транзакций было сказано что-то вроде "транзакции с одного терминала не видят транзакции с другого терминала". Звучит как-то непонятно. А что означает тут слово "терминал"? Мне кажется, более приближенный к практике пример - это не 2 терминала, открытые на одной машине в vscode, а 2 пользователя / приложения, подключённые к одной базе. Понимаю, что контент может быть для тех, кто только начинает изучать эту тему, но хотелось бы, чтобы информация подавалась чуть более подробно, если это возможно. Возможно дальше и раскроется тема. Если раскроется - удалю коммент
    Без негатива, успехов в развитии канала

    • @Parsifal-j4j
      @Parsifal-j4j 8 дней назад

      Чувак если он такие элементарные вещи будет еще объяснять ролик будет в два раза дольше. Терминал он из него пишет запрос к бд, как бы отдельная сессия с бд создается , получается две параллельные сессии пользователя субд. База данных у него postgresql

  • @sander1614
    @sander1614 Год назад +1

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

    • @codebrainy6246
      @codebrainy6246 10 месяцев назад +1

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

  • @777ElfenLied777
    @777ElfenLied777 Год назад +3

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

    • @pyramidhead9692
      @pyramidhead9692 Год назад

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

    • @TAF3000
      @TAF3000 Месяц назад

      @@pyramidhead9692 когда идёт 3-й апдейт, после коммита, там лежат актуальные данные у Alice 2 рубля!!! И не верно ей ставить просто 998! тут даже без транзакций будет ошибка

  • @foobarspam8548
    @foobarspam8548 Год назад +2

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

  • @pocketpodpopcorn
    @pocketpodpopcorn 2 месяца назад

    Я один против мира - Александр Гоголев

  • @palach_666
    @palach_666 10 месяцев назад

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

  • @zicksu2142
    @zicksu2142 9 месяцев назад +1

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

    • @ivangolang
      @ivangolang  9 месяцев назад +2

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

    • @ivangolang
      @ivangolang  9 месяцев назад +2

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

    • @zicksu2142
      @zicksu2142 9 месяцев назад

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

    • @Parsifal-j4j
      @Parsifal-j4j 8 дней назад

      @@zicksu2142так в итоге что? Повт чтение устраняет аномалию фантомного чтения, просто мне тоже казалось что это только на уровне serializable можно избежать

    • @zicksu2142
      @zicksu2142 8 дней назад

      ​@@Parsifal-j4j Ситуация интересная) В документации pg сказано, что фантомное чтение в принципе возможно на уровне repeatable read, но не в случае с PG. Дословно: "Allowed, but not in PG". Дальше отсебятина. Получается, что академически изоляция repeatable read не защищает от фантомного чтения, но не в случае с PG (хотят тут тоже есть нюанс, который ниже опишу). Могу ошибаться, но видимо за счет MVCC подхода (когда каждая транзакция до начала создает свой снэпшот данных и с ним работает) в PG как раз достигается отсутствие фантомов при повторном чтении. Что за нюанс? - снэпшот данных создается для каждой транзакции при старте и он попросту не видит того, что может случиться с данными в БД вне этого снэпшота пока работает текущая транзакция. Если первая транзакция работает со своим снэпшотом, а вторая транзакция в это время удалила строку (и закомитилась, а эта удаленная строка вошла в состав снэпшота первой транзакции), то в реальной БД этой строки нет, а в снэпшоте первой транзакции она есть и при повторном чтении в этой первой транзакции будет возвращен тот же результат, а значит фантомного чтения нет. Т.е. получается, что отсутствие фантомов обеспечивается в РАМКАХ ОДНОЙ ТРАНЗАКЦИИ ПРИ ПОВТОРНОМ ВЫПОЛНЕНИИ ЗАПРОСА. Т.е. отсутствие фантомов не абсолютное - в снэпшоте первой транзакции строка есть, а в реальной БД ее нет. И вероятно, когда первая транзакция будет комитится, то она пофейлится, т.к. PG увидит что данные из ее снэпшота содержат то, что уже удалено. И тогда придется делать ретрай для первой транзакции. Еще раз - это исключительное мое понимание и вольная трактовка инфы из доки. Могу быть не прав.

  • @llwebstylell242
    @llwebstylell242 8 месяцев назад

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

  • @YanchikDev
    @YanchikDev 9 месяцев назад

    Race condition?

  • @АлексейКузьмичёв-ц7о
    @АлексейКузьмичёв-ц7о 9 месяцев назад

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

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ Год назад +1

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

    • @VitaliyZlobin
      @VitaliyZlobin Год назад +4

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

    • @lelelelevv
      @lelelelevv Год назад +1

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

    • @zakharka3938
      @zakharka3938 10 месяцев назад

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

    • @VitaliyZlobin
      @VitaliyZlobin 10 месяцев назад

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

  • @Драугр
    @Драугр Год назад +1

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

  • @SemenP-i4x
    @SemenP-i4x Год назад

    Bro, snimau svou treugolky. Spasibo

  • @kl45gp
    @kl45gp 4 месяца назад

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

  • @olgababoshina-rj4us
    @olgababoshina-rj4us Год назад +6

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

  • @BYGUR
    @BYGUR 11 месяцев назад

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

    • @ИльяЗубков-ф8ж
      @ИльяЗубков-ф8ж 2 месяца назад

      Первое, что пришло в голову - по разному обрабатываем данные, можем применить разную функцию при двух одинаковых чтениях одних и тех же данных

  • @bilorus-marschak
    @bilorus-marschak Год назад

    Топ контент!

  • @p0isonspear
    @p0isonspear 6 месяцев назад

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

  • @Boyarsskiy
    @Boyarsskiy Год назад +8

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

    • @Parsifal-j4j
      @Parsifal-j4j 8 дней назад

      Я считаю что это база и ее нужно знать, может быть на Джуна достаточно просто уметь писать crud запросы но если ты хочешь больше зарабатывать то ты должен это знать

  • @tier61wro
    @tier61wro 6 месяцев назад

    нравятся твои видосы, но тут ты прям уже погас к середине видоса, похоже и правда с похмела)
    бросай ты это дело, а видосы снимать продолжай)

  • @vladddd1380
    @vladddd1380 4 месяца назад +1

    ЗАМАЙ 2024

  • @raphaelpashaev6683
    @raphaelpashaev6683 Год назад +1

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

  • @OREH88
    @OREH88 11 месяцев назад +1

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

  • @kibarabara
    @kibarabara Год назад

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

    • @kibarabara
      @kibarabara Год назад

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

    • @kibarabara
      @kibarabara Год назад

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

  • @justniktolol
    @justniktolol Год назад

    клад!

  • @nikolay4362
    @nikolay4362 Год назад +1

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

  • @Parsifal-j4j
    @Parsifal-j4j 8 дней назад

    Скажите а версионирование строки под капотом по умолчанию идет ? А оптимистический и пессимистический режимы есть такое?