Я задавался сам вопросом, и спрашивал программистов, по поводу логики принятия решений задач. Никто конкретики никакой не давал. Типо бери гугл и вперед. А здесь увидел ответы на свои вопросы. Чувак - ты крут. Чем, кстати подкупили твои предыдущие ролики, ты еще помимо своего опыта, подкидывал инфу про исследования, что тоже круто. Интересно будет посмотреть видео, как про решение других задач с несколькими паттернами, так и про память, способы запоминания. Про репликации и шардинг - это вообще огонь, когда выйдет. Читал книгу-кабана про репликации, но чувствую, ты сделаешь крутой проект на эту тему. п.с. смотрел на х2, считаю для себя адекватной скоростью восприятия. Все равно приходится делать паузы, для осознания и проверки информации. knapsack - задача о рюкзаке :). keep going!
@nickshuba302 сағат бұрын
Нечасто пишу комментарии, но сейчас решился. Топовый видос.
@dev_pushkinСағат бұрын
Пасиб ❤️
@effymlnchl6 сағат бұрын
спасибо!!
@magnilamer76666 сағат бұрын
Спасибо тебе за детальный разбор. Лучше разбей на 2 части. Первая часть была бы описанием как решать. Вторая - практический пример. Все очень доходчиво рассказано, но как ты и сам заметил смотреть тяжело. Смотрел на скорости 1.5. Но до конца с первого раза досмотреть не получилось.
@dev_pushkin6 сағат бұрын
Привет! Я специально хотел, чтобы именно все, что нужно было в одном месте, так как все это важно. Его можно просто смотреть за несколько дней. Не обязательно сразу :) Я понимаю, что хайпа не будет :) Но, кто осилит, сэкономит несоизмеримо больше времени и на ошибках, так как собирать это все самому очень затратно даже зная, что собираешь.
@ilyashabalin385915 сағат бұрын
Даёшь видео про обучение!!!!
@feterson255723 сағат бұрын
Вы прям во время выложили это видео. Спасибо
@Alex-hz4dkКүн бұрын
Спасибо!
@aspdof-wy7njКүн бұрын
кайф, спасибо за видео. перед сном все залпом послушаю)
@igorolikov1997Күн бұрын
norm контент пилишь
@danilbanan406Күн бұрын
Ашалеть 4 часа
@andreyklementev958Күн бұрын
Всем Изи-Пизи =)
@andreyklementev958Күн бұрын
Попробовал запросить реализацию на go чатжипити, он выдал на container/list без дженериков конечно. Спасибо за уроки, смотрю с интересом.
@dev_pushkinКүн бұрын
Да, я знаю про этот варик. Но, видишь, самому сделать один раз - изи пизи. И на разных языках знаем теперь, как сделать. :)
@LeisureTimeShow1Күн бұрын
В дополнение к лекциям Липовского по ТиПМС пойдет, очень информативно. А можно ссылочку на презентацию?
@tejinaji2 күн бұрын
Спасибо за труд, пересмотрю на репите)
@user-jv4tj5nz6q2 күн бұрын
спасибо, хорошее видео)
@grigorii90193 күн бұрын
Я дошел до 1.5 часов😂.
@dev_pushkin3 күн бұрын
Теперь в случае чего сможешь быстро найти, отмотать и вспомнить :)
@andreyklementev9584 күн бұрын
Годнота!!! Без рекламы курсов, автор красавчик.
@grigorii90194 күн бұрын
Сдох на 500 странице книги с кабанчиком, сейчас смотрю это видео. Собираюсь пройти открытые курсы для dev from postgresql. Но до сих пор понять не могу зачем мне все это. Я ведь простой свитчер работающий qa automation😂. Засосало)))
@dev_pushkin4 күн бұрын
Я ее когда прочитал, понял, что она оставляет дохрена открытых вопросов и сложно использовать. Типа вроде понятно, но куча мест, где чуть влево и вправо и хз уже. Но, енивей, очень хороша все равно и видно громадные усилия автора :)
@grigorii90194 күн бұрын
По крайней мере мозги вправляет. После нее фраза "раз мы хреново пишем монолиты, то почему кажется, что сможем хорошо микросервисы писать." Кажется менее смешной и более грустной.
@dev_pushkin4 күн бұрын
@@grigorii9019 не говори :)
@user-fr2dw3qd4v4 күн бұрын
Ошибка на 32:27. Там нет lost update. Вы же просто перетираете все поле новым значением. Если бы вы сеттали "balance + 7" во второй транзакции, то тогда получились бы эти 1514.
@dev_pushkin4 күн бұрын
Нет никакой ошибки. Посмотри внимательней, что делает сам паттерн в теоретическом видео и тогда получится понять суть. Я эмулирую запрос, который прилетает с разных сервисов параллельно в конкурентной среде по сети в любой момент времени. И вот так он прилетел. Иначе сделать в консоли это просто нельзя. Так же почитай комменты здесь с рассуждениями. Старайся воспринимать не буквально, а видеть паттерн, который за этим стоит и межсетевое взаимодействие.
@dev_pushkin4 күн бұрын
Также, посмотри видео про способы работы с бд и concurrency control. Станет более понятно это взаимодействие.
@user-fr2dw3qd4v4 күн бұрын
@@dev_pushkin пересмотрел блок из предыдущего видео на 15-й минуте. В принципе, пойнт прежний. Тут не важно, что это с эмуляция запроса с двух серверов. Вы даже если с одного сервиса последовательно такой запрос пришлете, то в итоге будет 1507. Во второй транзакции же даже не читается то, что в изменяемом поле может лежать. Туда просто сеттается новое значение.
@dev_pushkin4 күн бұрын
Посмотри очень внимательно, что там происходит. Нарисуй на бумажке. Мы читаем из одного сервиса значение и из другого то же значение (пишешь не читаем, что не так). Изоляция у обоих Read Committed. Выполняем какую-то бизнес логику приложения - вычисляем, что нужно старую сумму взять, добавить к ней новое значение и записать в бд. Это происходит конкурентно в каждом из двух сервисов. Изоляция нас не спасает и мы успешно пишем эти значения. Это и есть Lost Update. Уровни изоляции выше могут помочь в таком случае, но не всегда (как мы уже обсуждали в комментах тут). Тут ошибок никаких нет. Есть просто недопонимание работы механизма. Ты, по сути, его и описываешь, говоря, что это не он, используя некое свое понимание его работы. Как ее избежать, я говорю в тех видео, которые выше привел. balance + 7 там тоже есть, но и он не всегда может помочь - это зависит от условия задачи. Посмотри внимательно видео последнее и еще раз продумай ПАТТЕРН работы Lost Update и у тебя сложится картинка. Уже десятки раз обсудили все. Паттерн - мы перезаписываем данные безусловно в разных потоках (транзакция, запрос от сервиса и тд), тем или иным способом, по тем или иным причинам (ошибка в логике, вид и форма задачи и тд), затирая предыдущие данные.
@dev_pushkin4 күн бұрын
Надеюсь, я тебе помог. Если все еще никак - постарайся больше инфы собрать самостоятельно. Понять, как паттерн работает. Посмотреть примеры другие в статьях.
@viktorros4316 күн бұрын
Собственно вопрос: почему вы коснулись только 4х стандартных аномалий при объяснении уровней изоляции? просто интересно на каком уровне например не возможна Lost Update?
@dev_pushkin6 күн бұрын
Привет. В видео не только их четыре, а много других. Про лост апдейт - там тоже есть описание, когда можно защититься. В видео по практике мы пытаемся проверить это. В целом, эта аномалия может иметь разные формы и не всегда изоляция защитит. В последнем видео про concurrency control есть и другие способы решения этой проблемы. Думаю, тебе оно может тоже понравиться!
@viktorros4316 күн бұрын
@@dev_pushkin Гуд, спасибо за оперативный ответ))
@aleksey663913 күн бұрын
Странно, пробую воспроизвести ситуацию из 35:16 на postgresql 16.1. Дефолтная изоляция read commited, запускаю паралллельно обе транзации, выполняю часть первой вплоть до update, но пока не коммичу, выполняю часть второй вплоть до update и этот update замирает - ждет, когда первая транзакция будет закоммичена или на ней будет выполнен откат. Получает поведение аналогичное поведению с использованием инкремента, но при этом без использования инкремента. Как я понял по видео - тут обе транзакции должны отработать без блокировки друг друга на update. Что может вызывать такое отличное поведение?
@dev_pushkin13 күн бұрын
Привет. Это норм в пг. Так и будет. Он обеспечивает авто локи. Тебе надо глянуть видос с практикой про уровни изоляции транзакций - там делаем как раз это. Тут смысл не в блокировках или их отсутствии, а в аномалии - последние данные будут из второго запроса. У первого затрутся. Потом мы говорим, как сделать так, чтобы lost update избежать.
@dev_pushkin13 күн бұрын
Пг хоть и подождет, но запишет новые данные из второго запроса, забыв, что было до этого.
@dev_pushkin13 күн бұрын
Как раз такое поведение поможет тебе при использовании атомарных апдейтов, в которые мы добавим условия дополнительно для гарантий, если нужно.
@aleksey663913 күн бұрын
@@dev_pushkin Привет, спасибо за ответ! Вот как раз тоже думал об этом, получается, что хоть транзакции и выполнялись параллельно до лока, та, которая первая возьмет лок закоммитится первой, а другая второй. Получается этакое почти последовательное выполнение. Но раз они выполнялись, можно сказать, последовательно, то можно ли это считать за lost update? Казалось, что lost update - это когда мы потеряли обновление в процессе транзакции, т.к. если бы не было лока, то первая транзакция обновила бы данные, например, записав 200, а вторая, в тот момент, когда первая еще не закончилась, записала бы 300. Тогда, после обновления второй транзакции, первая транзакция бы у себя оперировала значением 300, а не 200, как казалось. Она бы могла еще что-то делать с этим обновленным значением, например, посчитать что-то на его основе и получив из-за этого неправильные результаты.
@dev_pushkin13 күн бұрын
Эта аномалия разные формы принимает. Но её паттерн везде один и тот же - одна действие затирает все, что делало предыдущее действие. Программа считала значение и на основе него применяет бизнес логику и сохраняет измененное значение в бд. В данном случае считаем, что мы добавили дельту к исходному значению. Два раза. В отдельных транзакциях. А в результате одна дельта потерялась. Чего мы не хотели получить. А хотели и первую добавить и вторую тоже. Представь, что эти операции прилетают с нашего сервиса в бд по сети. Считали, посчитали на сколько добавить и закинул обратно. И потеряли.
@AEF23C2013 күн бұрын
строго по теме: а не меняйте бд, и ничего не испортится ахаха! нет, это не шутка
@grigorii901914 күн бұрын
Gossiping можно очень мило перевести - на сплетничала, нашептал на ухо. Спасибо за видео.
@dev_pushkin14 күн бұрын
Спасибо) да я туплю иногда, когда думаешь на одном, говоришь на втором и наоборот 🤡
@grigorii901914 күн бұрын
@@dev_pushkin Не знаю, мне манера речи и понравилась). Особенно с поправкой на то, что нужно достаточно сложные концепции объяснить.
@dev_pushkin14 күн бұрын
Спасибо) ну да, это довольно не просто делать)
@kostinaleksey14 күн бұрын
Отличнное видео! Но есть пара замечаний: 1) read uncommitted всеже от одной аномалии защищает - lost update (если верить Wikipedia) 2) snapshot - этот термин более уместен в отношении repeatable read, а не к read commited (опять же из Wikipedia)
@dev_pushkin14 күн бұрын
Ты немного запутался. Не верь вики и проверь сам в следующем видео. И посмотри ещё видео про concurrency control. Про снэпшот тоже - постарайся не использовать вики как first source of truth. И старайся, когда слово слышишь, учитывать контекст и его смысл, назначение. Он может меняться в разных контекстах. Это важно. В видево я ещё говорил про SI и SSI. Посмотри, какие это уровни.
@user-hu6zc5uw1u15 күн бұрын
Спасибо за отличный материал
@mjeday15 күн бұрын
С версиями атомарно блокировать прикольно (в том плане, что что-то новое для себя узнал). Я обычно использую " locked TINYINT(1) DEFAULT 0". И в селекте беру "WHERE locked=0". В апдейте "SET locked=1". Когда нужно снять блокировку отдельно: "SET locked=0". Типа release/acquire. В чем преимущество именно версий? Помимо того, что не надо лишний апдейт делать, как в моем случае, когда снимается блокировка. Также version же должен быть AUTOINCREMENT? Что-то в видосе упустил этот момент.
@dev_pushkin14 күн бұрын
Видел такое, да. Не стал включать, так как чаще используется для блокировки на ресурс, но покрывается другими способами, про которые говорили. Усложняет логику программы самой, не всегда будет ясно, когда анлок делать и не сделать это с конфликтом или вообще забыть сделать. Добавляет дополнительно лишний запрос. Думаю, оно может в некоторых специфичных местах заюзаться. Типа залочить заказ на всегда, пока не разлочу сам вручную. Но, могу забыть и тд. Начинаются ручные анлоки, и проч. Вы ещё работаете с ним или забыли просто анлок? Вариант, если ресурсов мало и таких моментов мало. Получается оч жёсткий хороший контроль. Если их миллионы, то там уже не получится
@dev_pushkin14 күн бұрын
Ну и сам понимаешь, помимо нагрузки и лишнего запроса оно тормознет жёстко. Тут я бы больше с пессимистик сравнивал, а не с версиями. Они больше при параллельной работе и обновлениях. Миллионы запросов и они spare по отношению к разделяемым ресурсам.
@dev_pushkin14 күн бұрын
Ну я там говорил про версии, что мы их сами меняем в запросе. Тебе надо инкрементировать вручную для атомарности. А использовать можно и timestamp или что-то ещё, но чаще version. Compare and swap idiom.
@vova_dev15 күн бұрын
Классно, спасибо!
@dev_pushkin15 күн бұрын
Пожалуйста :)
@vova_dev16 күн бұрын
Спасибо за ваш труд!
@Scarlett-hs9fd16 күн бұрын
Спасибо большое!
@user-bo7se2wm5e17 күн бұрын
Посмотрел на одном дыхании(на 1.5, дикция хорошая), удалось структурировать определенные знания и что-то освежить, понять. Очень круто! Спасибо большое. Если расскажешь подробнее про volatile в жаве и спп, буду оч рад. а то пока не оч понятно, эта инструкция запрещает оптимизации и тд, но с точки зрения углубления в архитектуру компьютера(кстати и на эту тему был бы крутой видос, наверное). Где хранится в рам или в кэше процессора сразу и там кэш когерентность обеспечивает согласованность и такие моменты.
@stalkerandrei998417 күн бұрын
На каком уровне (джун, мидл..) надо знать про изоляции транзакций и все эти техники?
@dev_pushkin17 күн бұрын
Привет. Если джун уже хорошо сам язык знает, стоит это тоже все начинать изучать. Так как язык - инструмент. Я почти все собрал про них в паре видео и это сэкономит десятки часов, а кому-то и лет, если вместо сериала просто несколько раз их просмотреть и сами принципы запомнить и где быстро найти, если забыл. Чаще джуна такое не спрашивают, но, чем раньше хотя-бы узнать про это, тем больше мест, где ты будешь видеть это в работе и понимать.
@stalkerandrei998417 күн бұрын
@@dev_pushkin понял, спасибо. Сам Джун, но я каким то образом запоминаю все сразу что ты говоришь ( ну или 99%)
@stanislavshultchov340217 күн бұрын
Классное видео, хорошая подача материала. На 15 слайде вы по сути рассказываете про Event Sourcing (сохраняются все изменения состояния баланса пользователя в виде событий транзакций) который в основном конечно используется вместе с CQRS, но CQRS может использоваться и без Event Sourcing что не предполагает сохранение всех изменений состояния приложения в виде событий.
@dev_pushkin17 күн бұрын
Привет! Спасибо за коммент. На самом деле там нет противоречий. Могу использовать cqrs в любом виде, с event sourcing и без. Я бы мыслил немного с противоположной точки зрения, которая будет более generic и покроет частный случай с event sourcing. Я там уточнял в видево про сам паттерн, принцип и как он используется. Его реализация может быть разными способами. Говорим не про конкретную реализацию и event sourcing, к примеру , а принцип.
@justfakkenloginme3 күн бұрын
@@dev_pushkin так про то и речь, что CQRS в данном контексте проблему race condition сам по себе не решит, а вот event sourcing - решит
@dev_pushkin3 күн бұрын
Да, я понимаю, о чем он говорил. Проблем с этим нет, я просто мыслил в других категориях немного. Спасибо за коммент!
@deshtechno17 күн бұрын
В транзакциях, по идее, не стоит кидать запросы куда-либо, кроме самой БД. Вынесение этого из транзакции, конечно же, всё усложняет. Этой теме можно даже отдельное видео посвятить.
@dev_pushkin17 күн бұрын
Да, не стоит. Для этого есть разные техники обеспечения согласованности. Как минимум три знаю, если про распределеные системы. Но, я просто как пример привёл, тк там может быть что-то очень специфическое, не обязательно запрос.
@dev_pushkin17 күн бұрын
Вообще, ты очень чётко это подметил. Спасибо :)
@user-bo7se2wm5e18 күн бұрын
Мощно, качественный материал, продолжай подобное)
@user-uv6pm4hs3o18 күн бұрын
Ох хорошие примеры!!! Постоянно забываю и роюсь потом в инете. Сохранил себе :)
@user-uv6pm4hs3o18 күн бұрын
В большинстве проектов используют по умолчанию Serializable везде и не задумываются над производительностью. У меня в индусских проектах базы так жутко тормозят из-за того что никто не понимает нормально этих техник что вы привели в видео. А я тоже кстати забыл про NOWAIT. Хорошая штука чтобы не накапливать открытые транзакции.
@Mihes2218 күн бұрын
А можно ссылочку на донаты?
@Mihes2218 күн бұрын
Классно. Жду с нетерпением лабораторку по теории 👍
@GuruNemo18 күн бұрын
Плюс этого видео, что не просто сухое объяснение, но и примеры где и как такое может получиться. Минус, одно и тоже объясняешь по нескольку раз.
@Niki-nx6cd18 күн бұрын
Это чтобы точно все поняли
@jirikropocev991115 күн бұрын
@@Niki-nx6cd Угу. Повторение повторение - мать учения мать учения. А если серьёзно - то действительно выбросив повторы видео можно сделать вполовину короче.
@vladimireliseev760218 күн бұрын
Было бы круто, если бы объяснили как в postgresql работает уровень изоляции serializable! Т.е. как под капотом оно работает.
@3ombieautopilot18 күн бұрын
Спасибо за видео! Возможно, вы сделаете ролик про свои любимые книги для бекендеров? Книги, ведь, все читают 😅
@vladimireliseev760218 күн бұрын
Спасибо за видео! Скажите, а если мы атомарно делаем запрос, но в запросе много подзапросов и возможно cte, то оно выполнится атомарно?
@zakharka39385 күн бұрын
В SQL операторы всегда выполняются в рамках какой-либо транзакции: либо явно созданной, либо неявно созданной. То что автор называет атомарной операцией на самом деле оператор, выполняющийся в неявно созданной транзакции. Также и в вашем случае, перед выполнением запроса будет неявно создана транзакция.
@aghori26718 күн бұрын
Замечательный выпуск. Каждый жду с нетерпением. Даешь Побольше сложных тем для помидоров!
@megaman13able18 күн бұрын
Вот это ультанул, спасибо от души!
@korshyn0518 күн бұрын
Ждал этого видео, спасибо !
@Bankai_Kitetsu21 күн бұрын
1:27:22 дошел, пишу)) Спасибо огромное за твой труд! Очень классно все разжевал
@BurgerChannel22 күн бұрын
а на гугл док с командами есть линка?
@dev_pushkin21 күн бұрын
Привет! Добавил в описание!
@BurgerChannel21 күн бұрын
@@dev_pushkin❤
@user-uv6pm4hs3o23 күн бұрын
Про вариант про Lost Update при Serializable вообще в первый раз услышал. Ужас просто :)
@dev_pushkin23 күн бұрын
Привет! Можешь еще посмотреть обсуждения в комментах про это. Там немного разобрали. В пределах одной транзакции от сервиса - это скорее ошибка мышления "транзакция все сама сделает" + логическая ошибка в коде. Обнаружить возможно даже не сразу получится. Более реальная ситуация - например посылать со странички redmine параллельно запросы на update. Транзакцию долго держать не получится и толку от Serializable никакого не будет. Я об этом хочу в следующем видео побрейнштормить.
@user-uv6pm4hs3o23 күн бұрын
@@dev_pushkin итак понимаю Select for update наше все :)