|
|
|
миф ?
|
|||
|---|---|---|---|
|
#18+
http://habrahabr.ru/post/231213/#comment_7818389 вот тут рецепт якобы всегда работающего upsert (сам такими пользуюсь - в джобах, в тех местах, где не может быть конкуренции в силу особостей), но сомневаюсь в их безусловной надежности (если использовать не так, как предполагается в таких случаях - дергая одним шедъюлером не более чем в одном соединении, и зная , что никто более не меняет эти данные иными механизмами). например Код: plsql 1. 2. 3. 4. -- работает явно "неатомарно", что просто проверяется запуском 2-х транзакций, конкурирующих за 1 запсиь, пока не потребуешь явной очереди в первом же предложении стейтмента (иначе очередь собирается на 2-м, а в temp_table "припозднившихся транзакций" -- "неконсистентные", в неком смысле, данные): Код: plsql 1. 2. 3. 4. по ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента, когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется. -- поправьте меня, если я не прав. -- или кто-то предложит простой тест, подтверждающий проблемность реализации upsert, предложенной по ссылке ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 18:02:24 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
- Нельзя заблокировать (FOR UPDATE) строки которые еще не вставлены, что логично; - Такое возможно провернуть, заблокировав ТАБЛИЦУ (LOCK TABLE), что само по себе не гуманно. P.S. Ради проверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 18:33:45 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
Phoinix- Нельзя заблокировать (FOR UPDATE) строки которые еще не вставлены, что логично; - Такое возможно провернуть, заблокировав ТАБЛИЦУ (LOCK TABLE), что само по себе не гуманно. P.S. Ради проверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции.кхмммммммм................. речь не об апдейтах ключей, а всего прочего, при котором , без инсертов, никакой дупликейт-еррор невозможен ладно, проехали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 20:01:59 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
Не ладно и не проехали. Нагадил - будь добр, убери за собой. Если рандомно писать слова, то иногда будет получаться связный текст, но очень редко, в основном же - набор слов. Внимательно читаем суть вопроса, если надо идем по ссылке (впрочем основная часть темы по ссылке о другом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 10:29:46 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
PhoinixНе ладно и не проехали. Нагадил - будь добр, убери за собой. Если рандомно писать слова, то иногда будет получаться связный текст, но очень редко, в основном же - набор слов. Внимательно читаем суть вопроса, если надо идем по ссылке (впрочем основная часть темы по ссылке о другом). "проехали" -- в том смысле, что не спрашиваем "ты что дядя, дурак?" -- что очень хотелось спросить, но я сдержался невероятным усилием, ога. читаем действительно внимательно: авторпроверки: в обоих твоих примерах получил "ERROR: duplicate key" даже не прибегнув к транзакции " мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось) я привел "свои" примеры из другого случая, но тоже на тему того, что CTE "не атомарно" (не имеет единого снапшота, и одну и ту же запись может видеть в разных частях CTE на разные моменты времени. Для идиотов конечно надо всё расписать по полочкам ["связный текст"], но от идиотов ответов и не ожидали) т.ч. веди, пжалста, себя прилично, пока тебя явно не разоблачаюд. ЗЫ и только полный идиот может утверждать , что он получил что-то не прибегая к транзакциям, когда любой стейтмент -- это транзакция. Тогда уж надо писать [с претензией на "связный текст"] что-нть в стиле "без явного управления транзакциями" . (да и для получения unique-violation в технике, предлагаемой по ссылке, обязательно нужна конкуренция за id между транзакциями разных сессий) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 12:27:36 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
qwwq" мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось) qwwqпо ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента , когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется. Ну ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 12:42:15 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
Phoinixqwwq" мои " примеры -- это update c предварительной обработкой этих же записей в CTE. Только полный идиот мог получить на них key-violation, не апдейтя ключей. (но вот не хотелось с порога ставить очевидный диагноз, но пришлось) qwwqпо ссылке первое предложение стетймента уже делает FOR UPDATE, но проблема апсерта не только в том, чтобы сделать FOR UPDATE , а ещё и в том, чтобы не дать протиснутсья между предложениями INSERT-у конкурента , когда FOR UPDATE не получился (не было записи). А вот тут никакой уверенности нет, мне кажется. Ну ок. дон не читает, очевидно. или что-то вдумывает своё, глупоко личнойе. "мои" -- это про апдейт (см тег SQL в моём посте -- их там аккурат 2) "по ссылке" -- это не "мои". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 13:26:32 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 15:26:03 |
|
||
|
миф ?
|
|||
|---|---|---|---|
|
#18+
Phoinix, они могут писать что угодно, но апдейт полюбому встанет в очередь за конкурирующим, и будет производится над актуальной (т.е. отпущенной коммитом/роллбаком конкурента) записью. А вот "темп тейбл" будет, как показывает практика, заполнена по состоянию на начало транзакции (если мы не устроим [FOR UPDATE] очередь уже на ней - при входе на сложносоставной WITH). Другое дело, что отдельные стейтменты того же WITH при отборах "не видят" изменений сделанных предыдущими стейтментами того же самого with (изображают поведение repeatable read, но без проверки на repeated, и без выброса violation уровня изоляции repeatable read, если запись изменилась к этому моменту ). о чем они и хотели сообщить. Но апдейтят они таки актуальную версию, а не версию на начало "снапшота" [== "из снапшота"] (если таки они апдейтят неактуальную версию записиписи -- срочно свяжитесь с разработчиками, и объясните им, что они не правы). т.е. я видимо неверно тут притянул словцо "снапшот", надо как-то иначе выражовываццо. ну да ладно -- умный поймет, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 16:37:52 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38708081&tid=1998557]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
175ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 457ms |

| 0 / 0 |
