Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / миф ? / 9 сообщений из 9, страница 1 из 1
28.07.2014, 18:02:24
    #38707531
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
http://habrahabr.ru/post/231213/#comment_7818389

вот тут рецепт якобы всегда работающего upsert (сам такими пользуюсь - в джобах, в тех местах, где не может быть конкуренции в силу особостей), но сомневаюсь в их безусловной надежности (если использовать не так, как предполагается в таких случаях - дергая одним шедъюлером не более чем в одном соединении, и зная , что никто более не меняет эти данные иными механизмами).

например
Код: plsql
1.
2.
3.
4.
WITH s AS (SELECT {some record} FROM tab)
,a AS .............--кучка вычислений--
,b AS ..........
UPDATE tab {some record} SET .....


-- работает явно "неатомарно", что просто проверяется запуском 2-х транзакций, конкурирующих за 1 запсиь, пока не потребуешь явной очереди в первом же предложении стейтмента (иначе очередь собирается на 2-м, а в temp_table "припозднившихся транзакций" -- "неконсистентные", в неком смысле, данные):
Код: plsql
1.
2.
3.
4.
WITH s AS (SELECT {some record} FROM tab FOR UPDATE)
,a AS .............
,b AS ..........
UPDATE tab {some record}




по ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента, когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется.

-- поправьте меня, если я не прав.
-- или кто-то предложит простой тест, подтверждающий проблемность реализации upsert, предложенной по ссылке ?
...
Рейтинг: 0 / 0
28.07.2014, 18:33:45
    #38707562
Phoinix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
- Нельзя заблокировать (FOR UPDATE) строки которые еще не вставлены, что логично;
- Такое возможно провернуть, заблокировав ТАБЛИЦУ (LOCK TABLE), что само по себе не гуманно.

P.S. Ради проверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции.
...
Рейтинг: 0 / 0
28.07.2014, 20:01:59
    #38707619
миф ?
Phoinix- Нельзя заблокировать (FOR UPDATE) строки которые еще не вставлены, что логично;
- Такое возможно провернуть, заблокировав ТАБЛИЦУ (LOCK TABLE), что само по себе не гуманно.

P.S. Ради проверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции.кхмммммммм.................

речь не об апдейтах ключей, а всего прочего, при котором , без инсертов, никакой дупликейт-еррор невозможен

ладно, проехали
...
Рейтинг: 0 / 0
29.07.2014, 10:29:46
    #38707845
Phoinix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
Не ладно и не проехали.
Нагадил - будь добр, убери за собой.

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

Внимательно читаем суть вопроса, если надо идем по ссылке (впрочем основная часть темы по ссылке о другом).
...
Рейтинг: 0 / 0
29.07.2014, 12:27:36
    #38707988
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
PhoinixНе ладно и не проехали.
Нагадил - будь добр, убери за собой.

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

Внимательно читаем суть вопроса, если надо идем по ссылке (впрочем основная часть темы по ссылке о другом).

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


читаем действительно внимательно:
авторпроверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции

" мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось)

я привел "свои" примеры из другого случая, но тоже на тему того, что CTE "не атомарно" (не имеет единого снапшота, и одну и ту же запись может видеть в разных частях CTE на разные моменты времени. Для идиотов конечно надо всё расписать по полочкам ["связный текст"], но от идиотов ответов и не ожидали)

т.ч. веди, пжалста, себя прилично, пока тебя явно не разоблачаюд.



ЗЫ и только полный идиот может утверждать , что он получил что-то не прибегая к транзакциям, когда любой стейтмент -- это транзакция. Тогда уж надо писать [с претензией на "связный текст"] что-нть в стиле "без явного управления транзакциями" .

(да и для получения unique-violation в технике, предлагаемой по ссылке, обязательно нужна конкуренция за id между транзакциями разных сессий)
...
Рейтинг: 0 / 0
29.07.2014, 12:42:15
    #38708017
Phoinix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
qwwq" мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось)


qwwqпо ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента , когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется.

Ну ок.
...
Рейтинг: 0 / 0
29.07.2014, 13:26:32
    #38708081
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
Phoinixqwwq" мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось)


qwwqпо ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента , когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется.

Ну ок.
дон не читает, очевидно.
или что-то вдумывает своё, глупоко личнойе.

"мои" -- это про апдейт (см тег SQL в моём посте -- их там аккурат 2)

"по ссылке" -- это не "мои".
...
Рейтинг: 0 / 0
29.07.2014, 15:26:03
    #38708261
Phoinix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
qwwqPhoinixпропущено...


пропущено...


Ну ок.
дон не читает, очевидно.
или что-то вдумывает своё, глупоко личнойе.

"мои" -- это про апдейт (см тег SQL в моём посте -- их там аккурат 2)

"по ссылке" -- это не "мои".


Речь изначально шла об upsert ну ок, выяснили что не всегда работающий.
В твоем случае, тогда не совсем понятна боязнь конкурентных INSERT.

Впрочем ответ на твой вопрос все же находится здесь:

http://www.postgresql.org/docs/9.3/static/queries-with.html

The sub-statements in WITH are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH, the order in which the specified updates actually happen is unpredictable. All the statements are executed with the same snapshot (see Chapter 13), so they cannot "see" each others' effects on the target tables. This alleviates the effects of the unpredictability of the actual order of row updates, and means that RETURNING data is the only way to communicate changes between different WITH sub-statements and the main query. An example of this is that in
...
Рейтинг: 0 / 0
29.07.2014, 16:37:52
    #38708351
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
миф ?
Phoinix,

они могут писать что угодно, но апдейт полюбому встанет в очередь за конкурирующим, и будет производится над актуальной (т.е. отпущенной коммитом/роллбаком конкурента) записью. А вот "темп тейбл" будет, как показывает практика, заполнена по состоянию на начало транзакции (если мы не устроим [FOR UPDATE] очередь уже на ней - при входе на сложносоставной WITH).


Другое дело, что отдельные стейтменты того же WITH при отборах "не видят" изменений сделанных предыдущими стейтментами того же самого with (изображают поведение repeatable read, но без проверки на repeated, и без выброса violation уровня изоляции repeatable read, если запись изменилась к этому моменту ).
о чем они и хотели сообщить.
Но апдейтят они таки актуальную версию, а не версию на начало "снапшота" [== "из снапшота"] (если таки они апдейтят неактуальную версию записиписи -- срочно свяжитесь с разработчиками, и объясните им, что они не правы).

т.е. я видимо неверно тут притянул словцо "снапшот", надо как-то иначе выражовываццо. ну да ладно -- умный поймет,
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / миф ? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]