Добавлю еще немного про аномалию Lost Update. Я, конечно, уже запутался, перебирая разные источники в поисках ответов. Но кажется, что lost update — это самая аномальная аномалия — она то появляется то исчезает в зависимости от источника.
Например, в документации PostgreSQL она не упоминается совсем, даже в таблице ссылающейся на стандарт:
The SQL standard and PostgreSQL-implemented transaction isolation levels are described in Table 13.1.
Вот что, собственно, пишет сам стандарт об уровнях изоляции (ISO/IEC 9075-1:2011(E)), в котором транзакциям посвящены целых пол-страницы:
Every isolation level guarantees that no update is lost.
Не уверен, что речь идет именно об аномалии Lost Update, потому что упоминания других аномалий, как и слов anomaly и phenomena в документе найти не удалось.
Зато попалась на глаза статья от Microsoft. Вот выдержка из нее:
A lost update can be interpreted in one of two ways. In the first scenario, a lost update is considered to have taken place when data that has been updated by one transaction is overwritten by another transaction, before the first transaction is either committed or rolled back. This type of lost update cannot occur in SQL Server 2005 because it is not allowed under any transaction isolation level.
The other interpretation of a lost update is when one transaction (Transaction #1) reads data into its local memory, and then another transaction (Transaction #2) changes this data and commits its change. After this, Transaction #1 updates the same data based on what it read into memory before Transaction #2 was executed. In this case, the update performed by Transaction #2 can be considered a lost update.
Думаю, на этом я свои изыскания в области аномалий закончу...
то мне непонятно, что именно мы тут потеряли? Оба оператора UPDATE записывают в x фиксированное значение — их в принципе не интересует, что в x было до этого.
Почему не интересует? Это могут быть два человека-оператора, сидящих каждый за своим терминалом и вручную обновляющих записи. Как условный пример — инкрементируют счетчик. Сначала оба прочитали 10, записали 11. А должно быть в результате 12.
Я бы считал, что пара r1(x) w1(x) соответствует одному оператору
Мне кажется это уже вольная трактовка. Которая кстати автоматически означает, что операция инкремента "set value = value + 1" не атомарна (не изолирована).
Ну вот, много написал, но не уверен, что что-то прояснил (:
Да, прояснили. :) Пока вывод такой: раз есть проблема с формализованным представлением SQL-запроса в виде элементарных операций чтения и записи, то невозможно понять из скольки операций он состоит и где могут произойти коллизии. А из этого автоматически следует, что пытаться найти в нем аномалии бесполезно. Как и оперировать ими на практике. В принципе у меня было такое подозрение, но я всегда думал, что я что-то пропустил.
Тем не менее остается целых три варианта:
Использовать Serializable (если СУБД позволяет).
Использовать Read Committed с ручными блокировками.
Читать руководство по уровням изоляции конкретной СУБД, где написано что и как видят запросы и что в какой момент блокируется.
Еще один момент: у вас в табличке написано, что Postgres не допускает аномалии потерянных обновлений ни на на одном из уровней изоляции. В оф. документации я про это почему-то ничего не нашел, что также наводит на мысль, что поведение соответствует стандарту.
Однако вот в этой табличке https://github.com/ept/hermitage указано, что Postgres допускает данную аномалию (P4) на уровне Read Committed, что подтверждают мои собственные эксперименты. Сценарий приведен здесь: https://github.com/ept/hermitage/blob/master/postgres.md#lost-update-p4
Вполне похоже на r1(x) r2(x) w1(x) w2(x).
Но и если бы CTE выполнялся по шагам, тоже надо было бы блокировать.
Да, но по шагам блокироваться будет постепенно и с возможным разрешением коллизии через откат транзакции. А в CTE, подозреваю, все блокировки будут браться сразу и надолго. Т.е. это уже шаг в сторону последовательного выполнения транзакций, чего так не хотят вендоры СУБД, изобретая уровни изоляции.
Вот кстати есть формальный способ записи истории транзакций буквами r1(x), w1(x), c1, a1 (в книге у вас на сайте он тоже используется). Я сейчас подумал, что непонятно как записывать self-join, CTE, "set value = value + 1" с помощью такой нотации. Нет ли тут проблемы с формализацией?
Извините, что так много вопросов. Но раз уж начал спрашивать… Отдельный цикл про блокировки тоже буду читать, спасибо. Я, наверное, еще не скоро разберусь. :)
Стандарт не слишком много чего определяет, поэтому ориентироваться всегда надо на особенности конкретной реализации.
Видимо, так. Получается, что глядя на бизнес-транзакцию и уровень изоляции не получится понять будет ли приложение работать корректно. Для меня это открытие.
Не понимаю, почему? Запрос (если мы о SELECT говорим), выполняясь, никому не мешает.
В CTE можно писать запросы на изменение. Они могут быть тяжелыми. Я вижу тут 2 варианта: 1. Запросы из WITH должны интерпретироваться как шаги транзакции со всеми вытекающими. 2. Внутри СУБД нужно что-то заблокировать (причем возможно целыми площадями), чтобы предотвратить возможные коллизии с параллельными запросами.
Возьмите таблицу, соедините ее саму с собой, параллельно запустите обновление и сравните результат с известным правильным.
Я пробовал. Проблема в том, что таким образом сложно понять является ли результат случайным, особенностью реализации СУБД или поведением определенным в стандарте.
Мне попадалось несколько утверждений о том, что «одиночные» запросы страдают от тех же проблем, что и транзакции, состоящие из нескольких запросов. Правда все эти утверждения относились к SQL Server.
Вот и хочется понять, а что в запросе полностью атомарно (консистентно и изолированно). Ведь, если весь запрос, то таким образом с помощью CTE можно хорошенько «просадить» конкурентность. В то же время об уровнях изоляции думать не придется…
Очень хорошая статья. Спасибо! Вот только я так и не понял какой уровень изоляции у одного «SQL-оператора» и являются ли запросы CTE (а также подзапросы) отдельными операторами, в том числе рекурсивные. Да и что будет с банальным JOIN? Например, если мы соединяем тяжелую таблицу с собой по первичному ключу, а параллельно пролетает транзакция на обновление записи в этой таблице, может ли получится так, что значения в левой и правой части результата будут разными?
К моему удивлению, не удается найти какой-либо авторитетной информации по этим вопросам. Может быть вы прольете свет?
Документацию забыли. Как по мне, то документация Postgres не только на голову выше, чем в MySQL — она одна из лучших среди всего opensource. Мне думается, что по ней можно изучать не только СУБД, но и SQL.
Не пришлось бы быть агрессором сейчас в лице всего мира.
А как Вы относитесь к тому, что США разбомбили Ирак, повесили их лидера, разместили там свои войска и качают нефть? В то время как ядерное оружие, якобы из-за которого они туда влезли, они так и не нашли. Им можно, правда? Подумаешь, чуть-чуть ошиблись. Главное, что они пустынным дикарям привезли «демократию» и «цивилизацию» и жевательные конфеты. Дикари еще и спасибо сказать должны за это.
До этого они активно способствовали раздроблению Югославии. Потом им показалось, что их войска должны зачем-то быть в Афганистане. Чтобы охранять ночной сон афганцев, видимо. Не так давно они пытались залезть в Сирию…
Но это все не агрессия, это «распространение демократии в массы». А тюрьмы вроде Гуантанамо, расстрелы журналистов, заснятые на видео (возможно и случайные, но довольно циничные), шпионаж за правительствами других стран, система PRISM — это все необходимое зло, на которое приходится идти ради того, чтобы даже дикари могли получить свою порцию «демократии».
Резюмируя, скажу, что любое усиление России, будет считаться Западом как проявление агрессии. И не важно какого рода это усиление — военное, экономическое или еще какое-то. (Думаю, что экономическое даже актуальнее в наше время.) Потому что это угроза для них — угроза, того, что Россия больше не будет молча и исправно поставлять нефть в обмен на зеленые бумажки, что у нее появится собственное мнение и интересы, которые она будет отстаивать. В общем, у них свои геополитические интересы, у нас свои. А мнение о РФ в своих странах (и хорошо еще, если только в своих) он создадут такое, какое им будет выгодно, вне зависимости от объективной реальности.
Вы про которого спрашиваете? Про того, который речь толкал, или того, кто рядом стоял? Выступал один, ленточка вроде у другого. Зачем Вы все в кучу валите?
И чем вам так ленточка не угодила? Это вообще-то символ победы над фашистами. В этом причина?
И как бы он свалился, если тут уже Ваш соотечественник высказывался, что «Крым — это Украина и точка»? Другими словами: никакой Крыму независимости ни в каком виде, потому что у него там дача и бизнес, а он крайне не хочет, чтобы это имущество перешло в другую юрисдикцию.
Ресурс позиционирует себя как ресурс для рускоговорящих
Спасибо, но я в курсе для кого этот ресурс и как он себя позиционирует. Однако это не ответ на мой вопрос, который впрочем адресовался не украинцам, а тем, кто считает Россию своим врагом.
Возможно потому, что Украина не использовала жёлто-голубых
Только не говорите, что антироссийская риторика на Украине появилась исключительно с появлением «зеленых человечков». Не поверю. Хотя бы потому, что мой знакомый украинец уклончиво предпочел воздержаться от обсуждения взаимоотношений России и Украины. Это было 4 года назад. А с приходом «человечков» просто стали озвучивать вслух то, о чем раньше предпочитали помалкивать.
Слово «Украина» можете заменить на «Чечня», «Грузия»
А что Вы знаете о том, что происходило в Чечне и Грузии, кроме того, что там кто-то вроде как хотел независимости, а потом был вооруженный конфликт, в которой принимали участие российские военнослужащие? Хотя бы про чеченскую работорговлю слышали?
Ну, а уж 146% точно невозможно нарисовать, ага.
Возможно, но только если никто не против. При большом количестве протестующих рисовать становится крайне сложно. Лично я не поддерживаю российскую власть и голосовал против нее как мог. Но оглядываясь вокруг (особенно за пределы IT), я вижу, что большинство людей больше интересует какую машину покупать — шкоду или подкопить на полноценный VW (если вообще не BMW), чем протестовать против власти. Согласитесь, когда у вас такие насущные вопросы, какое вам дело до Путина и того, сколько он себе процентов нарисует? «Гайки закрутит»? Так суровость законов в России традиционно компенсируется не обязательностью их исполнения. Вот и получается, что население вцелом у нас власть поддерживает, пусть не активно, но пассивно.
Вы ведь понимаете, что в СССР республики имели право требовать независимости, в отличие от регионов унитарной Украины?
Давайте не будем заниматься буквоедством? Вы что адвокат? Законы — это не Божья истина. Их пишут люди для людей. И если закон не учитывает интересы людей, то люди будут решать вопросы по-другому — в том числе и силовыми методами, за неимением возможности повлиять на этот самый закон.
Можешь почитать свои же комментарии в этом посте еще раз. И если не усмотришь в них ни намека на то, что я сказал, то я уже вряд ли смогу объяснить почему я сделал такие выводы.
«Слышащий — да услышит, видящий — да узрит».
почему-то считаешь, что татары это какая-то обособленная группа людей под предводительством господина Джемилёва, которая прям вся такая однородная и настроенная против русских и России
Националисты — они такие) Раньше я считал, что русский народ грешит этим же, но почитав тут комментарии украинских «ненационалистов», которых «просто достала власть», мнение я свое изменил — русские очень толерантны на самом деле.
Ибо едва ли не в каждом заявлении украинского патриота прослеживается довольно простая мысль: «Украина — это моноэтническое государство, каждый, кто не украинец — тот гость, вне зависимости от того, сколько поколений его предков здесь живет, и должен вести себя так, как ведет себя турок, эмигрировавший в прошлом году в Германию. Кого не устраивает такое положение вещей — собирайте чемодан и валите в расею.»
Еще одно наблюдение: в России нет понятия аналогичного «украинскости».
Имущество с бизнесом можно иметь не только в своей стране, но и за границей. При этом также идет вложение в чужую экономику, рабочие места и т.д. и т.п. Но это не даст Вам права решать судьбу людей, проживающих на той территории, где Вы решили вести свой бизнес.
каждое перемещение за этими пределами обязано было согласовываться с властями Украины
Вопрос с какими властями? Пока был Янукович с ним и согласовывали. А после того как он сбежал с кем согласовывать? С теми, кто сам назначил себя на площади и кого не признает как минимум треть населения? Или с бандитами в масках с автоматами, которые публично унижают представителей власти, которых официально и законно никто не смещал с постов? Из-за всей этой неразберихи Россия теперь должна отказаться от всех своих интересов, которые были официально оговорены ранее, и сбежать поджав хвост вслед за Януковичем? Не думаю. Считаю, что именно Янукович виноват во всей этой несуразной истории. Он какой-никакой, но законный президент. И вместо того, чтобы выводить страну из кризиса или хотя бы высказать свое мнение, он предпочел слиться, подставив при этом всех и создав огромное поле для всяких кривотолков, пропаганды и неразберихи. Ну а в любой неразберихе как правило находятся заинтересованные люди, которые «под шумок» начинают реализовывать свои сокровенные мечты. И это не обязательно «цари» из соседних государств. Ими могут быть и обычные нацики, которые до этого отсиживались в подвале. А то и вообще «мотали срок» в местах не столь отдаленных.
Добавлю еще немного про аномалию Lost Update. Я, конечно, уже запутался, перебирая разные источники в поисках ответов. Но кажется, что lost update — это самая аномальная аномалия — она то появляется то исчезает в зависимости от источника.
Например, в документации PostgreSQL она не упоминается совсем, даже в таблице ссылающейся на стандарт:
Вот что, собственно, пишет сам стандарт об уровнях изоляции (ISO/IEC 9075-1:2011(E)), в котором транзакциям посвящены целых пол-страницы:
Не уверен, что речь идет именно об аномалии Lost Update, потому что упоминания других аномалий, как и слов anomaly и phenomena в документе найти не удалось.
Зато попалась на глаза статья от Microsoft. Вот выдержка из нее:
Думаю, на этом я свои изыскания в области аномалий закончу...
Спасибо вам за ответы!
Почему не интересует? Это могут быть два человека-оператора, сидящих каждый за своим терминалом и вручную обновляющих записи. Как условный пример — инкрементируют счетчик. Сначала оба прочитали 10, записали 11. А должно быть в результате 12.
Мне кажется это уже вольная трактовка. Которая кстати автоматически означает, что операция инкремента "set value = value + 1" не атомарна (не изолирована).
Да, прояснили. :) Пока вывод такой: раз есть проблема с формализованным представлением SQL-запроса в виде элементарных операций чтения и записи, то невозможно понять из скольки операций он состоит и где могут произойти коллизии. А из этого автоматически следует, что пытаться найти в нем аномалии бесполезно. Как и оперировать ими на практике. В принципе у меня было такое подозрение, но я всегда думал, что я что-то пропустил.
Тем не менее остается целых три варианта:
(Лучше, наверное, в обратном порядке)
Еще один момент: у вас в табличке написано, что Postgres не допускает аномалии потерянных обновлений ни на на одном из уровней изоляции. В оф. документации я про это почему-то ничего не нашел, что также наводит на мысль, что поведение соответствует стандарту.
Однако вот в этой табличке https://github.com/ept/hermitage указано, что Postgres допускает данную аномалию (P4) на уровне Read Committed, что подтверждают мои собственные эксперименты. Сценарий приведен здесь: https://github.com/ept/hermitage/blob/master/postgres.md#lost-update-p4
Вполне похоже на r1(x) r2(x) w1(x) w2(x).
Да, но по шагам блокироваться будет постепенно и с возможным разрешением коллизии через откат транзакции. А в CTE, подозреваю, все блокировки будут браться сразу и надолго. Т.е. это уже шаг в сторону последовательного выполнения транзакций, чего так не хотят вендоры СУБД, изобретая уровни изоляции.
Вот кстати есть формальный способ записи истории транзакций буквами r1(x), w1(x), c1, a1 (в книге у вас на сайте он тоже используется). Я сейчас подумал, что непонятно как записывать self-join, CTE, "set value = value + 1" с помощью такой нотации. Нет ли тут проблемы с формализацией?
Извините, что так много вопросов. Но раз уж начал спрашивать… Отдельный цикл про блокировки тоже буду читать, спасибо. Я, наверное, еще не скоро разберусь. :)
Видимо, так. Получается, что глядя на бизнес-транзакцию и уровень изоляции не получится понять будет ли приложение работать корректно. Для меня это открытие.
В CTE можно писать запросы на изменение. Они могут быть тяжелыми. Я вижу тут 2 варианта: 1. Запросы из WITH должны интерпретироваться как шаги транзакции со всеми вытекающими. 2. Внутри СУБД нужно что-то заблокировать (причем возможно целыми площадями), чтобы предотвратить возможные коллизии с параллельными запросами.
Я пробовал. Проблема в том, что таким образом сложно понять является ли результат случайным, особенностью реализации СУБД или поведением определенным в стандарте.
Мне попадалось несколько утверждений о том, что «одиночные» запросы страдают от тех же проблем, что и транзакции, состоящие из нескольких запросов. Правда все эти утверждения относились к SQL Server.
Вот и хочется понять, а что в запросе полностью атомарно (консистентно и изолированно). Ведь, если весь запрос, то таким образом с помощью CTE можно хорошенько «просадить» конкурентность. В то же время об уровнях изоляции думать не придется…
К моему удивлению, не удается найти какой-либо авторитетной информации по этим вопросам. Может быть вы прольете свет?
Еще раз спасибо!
г) спецслужбы РФ настолько крутые, что факт их присутствия доказать не представляется возможным.
Хотя не знаю насколько это вероятно в современных реалиях…
Ну а про «вежливых людей» Путин уже сам высказался: tv.mk.ru/video/6456-putin-pryamaya-liniya-zelenyie-chelovechki-eto-nashi-siloviki.html
А как Вы относитесь к тому, что США разбомбили Ирак, повесили их лидера, разместили там свои войска и качают нефть? В то время как ядерное оружие, якобы из-за которого они туда влезли, они так и не нашли. Им можно, правда? Подумаешь, чуть-чуть ошиблись. Главное, что они пустынным дикарям привезли «демократию» и «цивилизацию»
и жевательные конфеты. Дикари еще и спасибо сказать должны за это.До этого они активно способствовали раздроблению Югославии. Потом им показалось, что их войска должны зачем-то быть в Афганистане.
Чтобы охранять ночной сон афганцев, видимо.Не так давно они пытались залезть в Сирию…Но это все не агрессия, это «распространение демократии в массы». А тюрьмы вроде Гуантанамо, расстрелы журналистов, заснятые на видео (возможно и случайные, но довольно циничные), шпионаж за правительствами других стран, система PRISM — это все необходимое зло, на которое приходится идти ради того, чтобы даже дикари могли получить свою порцию «демократии».
Резюмируя, скажу, что любое усиление России, будет считаться Западом как проявление агрессии. И не важно какого рода это усиление — военное, экономическое или еще какое-то. (Думаю, что экономическое даже актуальнее в наше время.) Потому что это угроза для них — угроза, того, что Россия больше не будет молча и исправно поставлять нефть в обмен на зеленые бумажки, что у нее появится собственное мнение и интересы, которые она будет отстаивать. В общем, у них свои геополитические интересы, у нас свои. А мнение о РФ в своих странах (и хорошо еще, если только в своих) он создадут такое, какое им будет выгодно, вне зависимости от объективной реальности.
И чем вам так ленточка не угодила? Это вообще-то символ победы над фашистами. В этом причина?
Спасибо, но я в курсе для кого этот ресурс и как он себя позиционирует. Однако это не ответ на мой вопрос, который впрочем адресовался не украинцам, а тем, кто считает Россию своим врагом.
Только не говорите, что антироссийская риторика на Украине появилась исключительно с появлением «зеленых человечков». Не поверю. Хотя бы потому, что мой знакомый украинец уклончиво предпочел воздержаться от обсуждения взаимоотношений России и Украины. Это было 4 года назад. А с приходом «человечков» просто стали озвучивать вслух то, о чем раньше предпочитали помалкивать.
А что Вы знаете о том, что происходило в Чечне и Грузии, кроме того, что там кто-то вроде как хотел независимости, а потом был вооруженный конфликт, в которой принимали участие российские военнослужащие? Хотя бы про чеченскую работорговлю слышали?
Возможно, но только если никто не против. При большом количестве протестующих рисовать становится крайне сложно. Лично я не поддерживаю российскую власть и голосовал против нее как мог. Но оглядываясь вокруг (особенно за пределы IT), я вижу, что большинство людей больше интересует какую машину покупать — шкоду или подкопить на полноценный VW (если вообще не BMW), чем протестовать против власти. Согласитесь, когда у вас такие насущные вопросы, какое вам дело до Путина и того, сколько он себе процентов нарисует? «Гайки закрутит»? Так суровость законов в России традиционно компенсируется не обязательностью их исполнения. Вот и получается, что население вцелом у нас власть поддерживает, пусть не активно, но пассивно.
Давайте не будем заниматься буквоедством? Вы что адвокат? Законы — это не Божья истина. Их пишут люди для людей. И если закон не учитывает интересы людей, то люди будут решать вопросы по-другому — в том числе и силовыми методами, за неимением возможности повлиять на этот самый закон.
«Слышащий — да услышит, видящий — да узрит».
Националисты — они такие) Раньше я считал, что русский народ грешит этим же, но почитав тут комментарии украинских «ненационалистов», которых «просто достала власть», мнение я свое изменил — русские очень толерантны на самом деле.
Ибо едва ли не в каждом заявлении украинского патриота прослеживается довольно простая мысль: «Украина — это моноэтническое государство, каждый, кто не украинец — тот гость, вне зависимости от того, сколько поколений его предков здесь живет, и должен вести себя так, как ведет себя турок, эмигрировавший в прошлом году в Германию. Кого не устраивает такое положение вещей — собирайте чемодан и валите в расею.»
Еще одно наблюдение: в России нет понятия аналогичного «украинскости».
Имущество с бизнесом можно иметь не только в своей стране, но и за границей. При этом также идет вложение в чужую экономику, рабочие места и т.д. и т.п. Но это не даст Вам права решать судьбу людей, проживающих на той территории, где Вы решили вести свой бизнес.
Увы и ах, но гарантий в этом вопросе никаких нет.
Вопрос с какими властями? Пока был Янукович с ним и согласовывали. А после того как он сбежал с кем согласовывать? С теми, кто сам назначил себя на площади и кого не признает как минимум треть населения? Или с бандитами в масках с автоматами, которые публично унижают представителей власти, которых официально и законно никто не смещал с постов? Из-за всей этой неразберихи Россия теперь должна отказаться от всех своих интересов, которые были официально оговорены ранее, и сбежать поджав хвост вслед за Януковичем? Не думаю. Считаю, что именно Янукович виноват во всей этой несуразной истории. Он какой-никакой, но законный президент. И вместо того, чтобы выводить страну из кризиса или хотя бы высказать свое мнение, он предпочел слиться, подставив при этом всех и создав огромное поле для всяких кривотолков, пропаганды и неразберихи. Ну а в любой неразберихе как правило находятся заинтересованные люди, которые «под шумок» начинают реализовывать свои сокровенные мечты. И это не обязательно «цари» из соседних государств. Ими могут быть и обычные нацики, которые до этого отсиживались в подвале. А то и вообще «мотали срок» в местах не столь отдаленных.
В остальном согласен с Вами.