Пікірлер
@genshen4703
@genshen4703 Сағат бұрын
Я задавался сам вопросом, и спрашивал программистов, по поводу логики принятия решений задач. Никто конкретики никакой не давал. Типо бери гугл и вперед. А здесь увидел ответы на свои вопросы. Чувак - ты крут. Чем, кстати подкупили твои предыдущие ролики, ты еще помимо своего опыта, подкидывал инфу про исследования, что тоже круто. Интересно будет посмотреть видео, как про решение других задач с несколькими паттернами, так и про память, способы запоминания. Про репликации и шардинг - это вообще огонь, когда выйдет. Читал книгу-кабана про репликации, но чувствую, ты сделаешь крутой проект на эту тему. п.с. смотрел на х2, считаю для себя адекватной скоростью восприятия. Все равно приходится делать паузы, для осознания и проверки информации. knapsack - задача о рюкзаке :). keep going!
@nickshuba30
@nickshuba30 2 сағат бұрын
Нечасто пишу комментарии, но сейчас решился. Топовый видос.
@dev_pushkin
@dev_pushkin Сағат бұрын
Пасиб ❤️
@effymlnchl
@effymlnchl 6 сағат бұрын
спасибо!!
@magnilamer7666
@magnilamer7666 6 сағат бұрын
Спасибо тебе за детальный разбор. Лучше разбей на 2 части. Первая часть была бы описанием как решать. Вторая - практический пример. Все очень доходчиво рассказано, но как ты и сам заметил смотреть тяжело. Смотрел на скорости 1.5. Но до конца с первого раза досмотреть не получилось.
@dev_pushkin
@dev_pushkin 6 сағат бұрын
Привет! Я специально хотел, чтобы именно все, что нужно было в одном месте, так как все это важно. Его можно просто смотреть за несколько дней. Не обязательно сразу :) Я понимаю, что хайпа не будет :) Но, кто осилит, сэкономит несоизмеримо больше времени и на ошибках, так как собирать это все самому очень затратно даже зная, что собираешь.
@ilyashabalin3859
@ilyashabalin3859 15 сағат бұрын
Даёшь видео про обучение!!!!
@feterson2557
@feterson2557 23 сағат бұрын
Вы прям во время выложили это видео. Спасибо
@Alex-hz4dk
@Alex-hz4dk Күн бұрын
Спасибо!
@aspdof-wy7nj
@aspdof-wy7nj Күн бұрын
кайф, спасибо за видео. перед сном все залпом послушаю)
@igorolikov1997
@igorolikov1997 Күн бұрын
norm контент пилишь
@danilbanan406
@danilbanan406 Күн бұрын
Ашалеть 4 часа
@andreyklementev958
@andreyklementev958 Күн бұрын
Всем Изи-Пизи =)
@andreyklementev958
@andreyklementev958 Күн бұрын
Попробовал запросить реализацию на go чатжипити, он выдал на container/list без дженериков конечно. Спасибо за уроки, смотрю с интересом.
@dev_pushkin
@dev_pushkin Күн бұрын
Да, я знаю про этот варик. Но, видишь, самому сделать один раз - изи пизи. И на разных языках знаем теперь, как сделать. :)
@LeisureTimeShow1
@LeisureTimeShow1 Күн бұрын
В дополнение к лекциям Липовского по ТиПМС пойдет, очень информативно. А можно ссылочку на презентацию?
@tejinaji
@tejinaji 2 күн бұрын
Спасибо за труд, пересмотрю на репите)
@user-jv4tj5nz6q
@user-jv4tj5nz6q 2 күн бұрын
спасибо, хорошее видео)
@grigorii9019
@grigorii9019 3 күн бұрын
Я дошел до 1.5 часов😂.
@dev_pushkin
@dev_pushkin 3 күн бұрын
Теперь в случае чего сможешь быстро найти, отмотать и вспомнить :)
@andreyklementev958
@andreyklementev958 4 күн бұрын
Годнота!!! Без рекламы курсов, автор красавчик.
@grigorii9019
@grigorii9019 4 күн бұрын
Сдох на 500 странице книги с кабанчиком, сейчас смотрю это видео. Собираюсь пройти открытые курсы для dev from postgresql. Но до сих пор понять не могу зачем мне все это. Я ведь простой свитчер работающий qa automation😂. Засосало)))
@dev_pushkin
@dev_pushkin 4 күн бұрын
Я ее когда прочитал, понял, что она оставляет дохрена открытых вопросов и сложно использовать. Типа вроде понятно, но куча мест, где чуть влево и вправо и хз уже. Но, енивей, очень хороша все равно и видно громадные усилия автора :)
@grigorii9019
@grigorii9019 4 күн бұрын
По крайней мере мозги вправляет. После нее фраза "раз мы хреново пишем монолиты, то почему кажется, что сможем хорошо микросервисы писать." Кажется менее смешной и более грустной.
@dev_pushkin
@dev_pushkin 4 күн бұрын
@@grigorii9019 не говори :)
@user-fr2dw3qd4v
@user-fr2dw3qd4v 4 күн бұрын
Ошибка на 32:27. Там нет lost update. Вы же просто перетираете все поле новым значением. Если бы вы сеттали "balance + 7" во второй транзакции, то тогда получились бы эти 1514.
@dev_pushkin
@dev_pushkin 4 күн бұрын
Нет никакой ошибки. Посмотри внимательней, что делает сам паттерн в теоретическом видео и тогда получится понять суть. Я эмулирую запрос, который прилетает с разных сервисов параллельно в конкурентной среде по сети в любой момент времени. И вот так он прилетел. Иначе сделать в консоли это просто нельзя. Так же почитай комменты здесь с рассуждениями. Старайся воспринимать не буквально, а видеть паттерн, который за этим стоит и межсетевое взаимодействие.
@dev_pushkin
@dev_pushkin 4 күн бұрын
Также, посмотри видео про способы работы с бд и concurrency control. Станет более понятно это взаимодействие.
@user-fr2dw3qd4v
@user-fr2dw3qd4v 4 күн бұрын
@@dev_pushkin пересмотрел блок из предыдущего видео на 15-й минуте. В принципе, пойнт прежний. Тут не важно, что это с эмуляция запроса с двух серверов. Вы даже если с одного сервиса последовательно такой запрос пришлете, то в итоге будет 1507. Во второй транзакции же даже не читается то, что в изменяемом поле может лежать. Туда просто сеттается новое значение.
@dev_pushkin
@dev_pushkin 4 күн бұрын
Посмотри очень внимательно, что там происходит. Нарисуй на бумажке. Мы читаем из одного сервиса значение и из другого то же значение (пишешь не читаем, что не так). Изоляция у обоих Read Committed. Выполняем какую-то бизнес логику приложения - вычисляем, что нужно старую сумму взять, добавить к ней новое значение и записать в бд. Это происходит конкурентно в каждом из двух сервисов. Изоляция нас не спасает и мы успешно пишем эти значения. Это и есть Lost Update. Уровни изоляции выше могут помочь в таком случае, но не всегда (как мы уже обсуждали в комментах тут). Тут ошибок никаких нет. Есть просто недопонимание работы механизма. Ты, по сути, его и описываешь, говоря, что это не он, используя некое свое понимание его работы. Как ее избежать, я говорю в тех видео, которые выше привел. balance + 7 там тоже есть, но и он не всегда может помочь - это зависит от условия задачи. Посмотри внимательно видео последнее и еще раз продумай ПАТТЕРН работы Lost Update и у тебя сложится картинка. Уже десятки раз обсудили все. Паттерн - мы перезаписываем данные безусловно в разных потоках (транзакция, запрос от сервиса и тд), тем или иным способом, по тем или иным причинам (ошибка в логике, вид и форма задачи и тд), затирая предыдущие данные.
@dev_pushkin
@dev_pushkin 4 күн бұрын
Надеюсь, я тебе помог. Если все еще никак - постарайся больше инфы собрать самостоятельно. Понять, как паттерн работает. Посмотреть примеры другие в статьях.
@viktorros431
@viktorros431 6 күн бұрын
Собственно вопрос: почему вы коснулись только 4х стандартных аномалий при объяснении уровней изоляции? просто интересно на каком уровне например не возможна Lost Update?
@dev_pushkin
@dev_pushkin 6 күн бұрын
Привет. В видео не только их четыре, а много других. Про лост апдейт - там тоже есть описание, когда можно защититься. В видео по практике мы пытаемся проверить это. В целом, эта аномалия может иметь разные формы и не всегда изоляция защитит. В последнем видео про concurrency control есть и другие способы решения этой проблемы. Думаю, тебе оно может тоже понравиться!
@viktorros431
@viktorros431 6 күн бұрын
@@dev_pushkin Гуд, спасибо за оперативный ответ))
@aleksey6639
@aleksey6639 13 күн бұрын
Странно, пробую воспроизвести ситуацию из 35:16 на postgresql 16.1. Дефолтная изоляция read commited, запускаю паралллельно обе транзации, выполняю часть первой вплоть до update, но пока не коммичу, выполняю часть второй вплоть до update и этот update замирает - ждет, когда первая транзакция будет закоммичена или на ней будет выполнен откат. Получает поведение аналогичное поведению с использованием инкремента, но при этом без использования инкремента. Как я понял по видео - тут обе транзакции должны отработать без блокировки друг друга на update. Что может вызывать такое отличное поведение?
@dev_pushkin
@dev_pushkin 13 күн бұрын
Привет. Это норм в пг. Так и будет. Он обеспечивает авто локи. Тебе надо глянуть видос с практикой про уровни изоляции транзакций - там делаем как раз это. Тут смысл не в блокировках или их отсутствии, а в аномалии - последние данные будут из второго запроса. У первого затрутся. Потом мы говорим, как сделать так, чтобы lost update избежать.
@dev_pushkin
@dev_pushkin 13 күн бұрын
Пг хоть и подождет, но запишет новые данные из второго запроса, забыв, что было до этого.
@dev_pushkin
@dev_pushkin 13 күн бұрын
Как раз такое поведение поможет тебе при использовании атомарных апдейтов, в которые мы добавим условия дополнительно для гарантий, если нужно.
@aleksey6639
@aleksey6639 13 күн бұрын
​@@dev_pushkin Привет, спасибо за ответ! Вот как раз тоже думал об этом, получается, что хоть транзакции и выполнялись параллельно до лока, та, которая первая возьмет лок закоммитится первой, а другая второй. Получается этакое почти последовательное выполнение. Но раз они выполнялись, можно сказать, последовательно, то можно ли это считать за lost update? Казалось, что lost update - это когда мы потеряли обновление в процессе транзакции, т.к. если бы не было лока, то первая транзакция обновила бы данные, например, записав 200, а вторая, в тот момент, когда первая еще не закончилась, записала бы 300. Тогда, после обновления второй транзакции, первая транзакция бы у себя оперировала значением 300, а не 200, как казалось. Она бы могла еще что-то делать с этим обновленным значением, например, посчитать что-то на его основе и получив из-за этого неправильные результаты.
@dev_pushkin
@dev_pushkin 13 күн бұрын
Эта аномалия разные формы принимает. Но её паттерн везде один и тот же - одна действие затирает все, что делало предыдущее действие. Программа считала значение и на основе него применяет бизнес логику и сохраняет измененное значение в бд. В данном случае считаем, что мы добавили дельту к исходному значению. Два раза. В отдельных транзакциях. А в результате одна дельта потерялась. Чего мы не хотели получить. А хотели и первую добавить и вторую тоже. Представь, что эти операции прилетают с нашего сервиса в бд по сети. Считали, посчитали на сколько добавить и закинул обратно. И потеряли.
@AEF23C20
@AEF23C20 13 күн бұрын
строго по теме: а не меняйте бд, и ничего не испортится ахаха! нет, это не шутка
@grigorii9019
@grigorii9019 14 күн бұрын
Gossiping можно очень мило перевести - на сплетничала, нашептал на ухо. Спасибо за видео.
@dev_pushkin
@dev_pushkin 14 күн бұрын
Спасибо) да я туплю иногда, когда думаешь на одном, говоришь на втором и наоборот 🤡
@grigorii9019
@grigorii9019 14 күн бұрын
@@dev_pushkin Не знаю, мне манера речи и понравилась). Особенно с поправкой на то, что нужно достаточно сложные концепции объяснить.
@dev_pushkin
@dev_pushkin 14 күн бұрын
Спасибо) ну да, это довольно не просто делать)
@kostinaleksey
@kostinaleksey 14 күн бұрын
Отличнное видео! Но есть пара замечаний: 1) read uncommitted всеже от одной аномалии защищает - lost update (если верить Wikipedia) 2) snapshot - этот термин более уместен в отношении repeatable read, а не к read commited (опять же из Wikipedia)
@dev_pushkin
@dev_pushkin 14 күн бұрын
Ты немного запутался. Не верь вики и проверь сам в следующем видео. И посмотри ещё видео про concurrency control. Про снэпшот тоже - постарайся не использовать вики как first source of truth. И старайся, когда слово слышишь, учитывать контекст и его смысл, назначение. Он может меняться в разных контекстах. Это важно. В видево я ещё говорил про SI и SSI. Посмотри, какие это уровни.
@user-hu6zc5uw1u
@user-hu6zc5uw1u 15 күн бұрын
Спасибо за отличный материал
@mjeday
@mjeday 15 күн бұрын
С версиями атомарно блокировать прикольно (в том плане, что что-то новое для себя узнал). Я обычно использую " locked TINYINT(1) DEFAULT 0". И в селекте беру "WHERE locked=0". В апдейте "SET locked=1". Когда нужно снять блокировку отдельно: "SET locked=0". Типа release/acquire. В чем преимущество именно версий? Помимо того, что не надо лишний апдейт делать, как в моем случае, когда снимается блокировка. Также version же должен быть AUTOINCREMENT? Что-то в видосе упустил этот момент.
@dev_pushkin
@dev_pushkin 14 күн бұрын
Видел такое, да. Не стал включать, так как чаще используется для блокировки на ресурс, но покрывается другими способами, про которые говорили. Усложняет логику программы самой, не всегда будет ясно, когда анлок делать и не сделать это с конфликтом или вообще забыть сделать. Добавляет дополнительно лишний запрос. Думаю, оно может в некоторых специфичных местах заюзаться. Типа залочить заказ на всегда, пока не разлочу сам вручную. Но, могу забыть и тд. Начинаются ручные анлоки, и проч. Вы ещё работаете с ним или забыли просто анлок? Вариант, если ресурсов мало и таких моментов мало. Получается оч жёсткий хороший контроль. Если их миллионы, то там уже не получится
@dev_pushkin
@dev_pushkin 14 күн бұрын
Ну и сам понимаешь, помимо нагрузки и лишнего запроса оно тормознет жёстко. Тут я бы больше с пессимистик сравнивал, а не с версиями. Они больше при параллельной работе и обновлениях. Миллионы запросов и они spare по отношению к разделяемым ресурсам.
@dev_pushkin
@dev_pushkin 14 күн бұрын
Ну я там говорил про версии, что мы их сами меняем в запросе. Тебе надо инкрементировать вручную для атомарности. А использовать можно и timestamp или что-то ещё, но чаще version. Compare and swap idiom.
@vova_dev
@vova_dev 15 күн бұрын
Классно, спасибо!
@dev_pushkin
@dev_pushkin 15 күн бұрын
Пожалуйста :)
@vova_dev
@vova_dev 16 күн бұрын
Спасибо за ваш труд!
@Scarlett-hs9fd
@Scarlett-hs9fd 16 күн бұрын
Спасибо большое!
@user-bo7se2wm5e
@user-bo7se2wm5e 17 күн бұрын
Посмотрел на одном дыхании(на 1.5, дикция хорошая), удалось структурировать определенные знания и что-то освежить, понять. Очень круто! Спасибо большое. Если расскажешь подробнее про volatile в жаве и спп, буду оч рад. а то пока не оч понятно, эта инструкция запрещает оптимизации и тд, но с точки зрения углубления в архитектуру компьютера(кстати и на эту тему был бы крутой видос, наверное). Где хранится в рам или в кэше процессора сразу и там кэш когерентность обеспечивает согласованность и такие моменты.
@stalkerandrei9984
@stalkerandrei9984 17 күн бұрын
На каком уровне (джун, мидл..) надо знать про изоляции транзакций и все эти техники?
@dev_pushkin
@dev_pushkin 17 күн бұрын
Привет. Если джун уже хорошо сам язык знает, стоит это тоже все начинать изучать. Так как язык - инструмент. Я почти все собрал про них в паре видео и это сэкономит десятки часов, а кому-то и лет, если вместо сериала просто несколько раз их просмотреть и сами принципы запомнить и где быстро найти, если забыл. Чаще джуна такое не спрашивают, но, чем раньше хотя-бы узнать про это, тем больше мест, где ты будешь видеть это в работе и понимать.
@stalkerandrei9984
@stalkerandrei9984 17 күн бұрын
@@dev_pushkin понял, спасибо. Сам Джун, но я каким то образом запоминаю все сразу что ты говоришь ( ну или 99%)
@stanislavshultchov3402
@stanislavshultchov3402 17 күн бұрын
Классное видео, хорошая подача материала. На 15 слайде вы по сути рассказываете про Event Sourcing (сохраняются все изменения состояния баланса пользователя в виде событий транзакций) который в основном конечно используется вместе с CQRS, но CQRS может использоваться и без Event Sourcing что не предполагает сохранение всех изменений состояния приложения в виде событий.
@dev_pushkin
@dev_pushkin 17 күн бұрын
Привет! Спасибо за коммент. На самом деле там нет противоречий. Могу использовать cqrs в любом виде, с event sourcing и без. Я бы мыслил немного с противоположной точки зрения, которая будет более generic и покроет частный случай с event sourcing. Я там уточнял в видево про сам паттерн, принцип и как он используется. Его реализация может быть разными способами. Говорим не про конкретную реализацию и event sourcing, к примеру , а принцип.
@justfakkenloginme
@justfakkenloginme 3 күн бұрын
@@dev_pushkin так про то и речь, что CQRS в данном контексте проблему race condition сам по себе не решит, а вот event sourcing - решит
@dev_pushkin
@dev_pushkin 3 күн бұрын
Да, я понимаю, о чем он говорил. Проблем с этим нет, я просто мыслил в других категориях немного. Спасибо за коммент!
@deshtechno
@deshtechno 17 күн бұрын
В транзакциях, по идее, не стоит кидать запросы куда-либо, кроме самой БД. Вынесение этого из транзакции, конечно же, всё усложняет. Этой теме можно даже отдельное видео посвятить.
@dev_pushkin
@dev_pushkin 17 күн бұрын
Да, не стоит. Для этого есть разные техники обеспечения согласованности. Как минимум три знаю, если про распределеные системы. Но, я просто как пример привёл, тк там может быть что-то очень специфическое, не обязательно запрос.
@dev_pushkin
@dev_pushkin 17 күн бұрын
Вообще, ты очень чётко это подметил. Спасибо :)
@user-bo7se2wm5e
@user-bo7se2wm5e 18 күн бұрын
Мощно, качественный материал, продолжай подобное)
@user-uv6pm4hs3o
@user-uv6pm4hs3o 18 күн бұрын
Ох хорошие примеры!!! Постоянно забываю и роюсь потом в инете. Сохранил себе :)
@user-uv6pm4hs3o
@user-uv6pm4hs3o 18 күн бұрын
В большинстве проектов используют по умолчанию Serializable везде и не задумываются над производительностью. У меня в индусских проектах базы так жутко тормозят из-за того что никто не понимает нормально этих техник что вы привели в видео. А я тоже кстати забыл про NOWAIT. Хорошая штука чтобы не накапливать открытые транзакции.
@Mihes22
@Mihes22 18 күн бұрын
А можно ссылочку на донаты?
@Mihes22
@Mihes22 18 күн бұрын
Классно. Жду с нетерпением лабораторку по теории 👍
@GuruNemo
@GuruNemo 18 күн бұрын
Плюс этого видео, что не просто сухое объяснение, но и примеры где и как такое может получиться. Минус, одно и тоже объясняешь по нескольку раз.
@Niki-nx6cd
@Niki-nx6cd 18 күн бұрын
Это чтобы точно все поняли
@jirikropocev9911
@jirikropocev9911 15 күн бұрын
@@Niki-nx6cd Угу. Повторение повторение - мать учения мать учения. А если серьёзно - то действительно выбросив повторы видео можно сделать вполовину короче.
@vladimireliseev7602
@vladimireliseev7602 18 күн бұрын
Было бы круто, если бы объяснили как в postgresql работает уровень изоляции serializable! Т.е. как под капотом оно работает.
@3ombieautopilot
@3ombieautopilot 18 күн бұрын
Спасибо за видео! Возможно, вы сделаете ролик про свои любимые книги для бекендеров? Книги, ведь, все читают 😅
@vladimireliseev7602
@vladimireliseev7602 18 күн бұрын
Спасибо за видео! Скажите, а если мы атомарно делаем запрос, но в запросе много подзапросов и возможно cte, то оно выполнится атомарно?
@zakharka3938
@zakharka3938 5 күн бұрын
В SQL операторы всегда выполняются в рамках какой-либо транзакции: либо явно созданной, либо неявно созданной. То что автор называет атомарной операцией на самом деле оператор, выполняющийся в неявно созданной транзакции. Также и в вашем случае, перед выполнением запроса будет неявно создана транзакция.
@aghori267
@aghori267 18 күн бұрын
Замечательный выпуск. Каждый жду с нетерпением. Даешь Побольше сложных тем для помидоров!
@megaman13able
@megaman13able 18 күн бұрын
Вот это ультанул, спасибо от души!
@korshyn05
@korshyn05 18 күн бұрын
Ждал этого видео, спасибо !
@Bankai_Kitetsu
@Bankai_Kitetsu 21 күн бұрын
1:27:22 дошел, пишу)) Спасибо огромное за твой труд! Очень классно все разжевал
@BurgerChannel
@BurgerChannel 22 күн бұрын
а на гугл док с командами есть линка?
@dev_pushkin
@dev_pushkin 21 күн бұрын
Привет! Добавил в описание!
@BurgerChannel
@BurgerChannel 21 күн бұрын
​@@dev_pushkin❤
@user-uv6pm4hs3o
@user-uv6pm4hs3o 23 күн бұрын
Про вариант про Lost Update при Serializable вообще в первый раз услышал. Ужас просто :)
@dev_pushkin
@dev_pushkin 23 күн бұрын
Привет! Можешь еще посмотреть обсуждения в комментах про это. Там немного разобрали. В пределах одной транзакции от сервиса - это скорее ошибка мышления "транзакция все сама сделает" + логическая ошибка в коде. Обнаружить возможно даже не сразу получится. Более реальная ситуация - например посылать со странички redmine параллельно запросы на update. Транзакцию долго держать не получится и толку от Serializable никакого не будет. Я об этом хочу в следующем видео побрейнштормить.
@user-uv6pm4hs3o
@user-uv6pm4hs3o 23 күн бұрын
@@dev_pushkin итак понимаю Select for update наше все :)
@user-uv6pm4hs3o
@user-uv6pm4hs3o 23 күн бұрын
Дошел до How to choose. Конспектирую дальше.
@user-du3uv6jc5x
@user-du3uv6jc5x 23 күн бұрын
я дошел до 1:27:25))