
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
29.08.2013, 09:56
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Как разруливаются такие ситуации. Если у нас есть определённая запись в табличке - мы её меняем, если нету, вставляем(IF EXISTS UPDATE ELSE INSERT). Причём в UPDATE мы меняем флаг, а в INSERT вставляем ГИГАБАЙТ, потому желательно делать это разными запросами. Табличку могут менять разные процессы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 11:05
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
ответ на вопрос специфичен для конкретной СУБД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 11:14
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Если Вы в Insert вставляете гигабайт - то вряд ли таких вставок у Вас сотня в секунду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 11:27
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
субд - MsSql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 11:43
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
bubuzuсубд - MsSqlMERGE, если это одна и та же таблица и версия >= 2008. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 12:38
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Ennor TiegaelMERGE, если это одна и та же таблица и версия >= 2008. А что делать с ГИГАБАЙТом, не тащить же его в каждый запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 13:03
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
можно попробовать сделать update, если не получится, то запустить MERGE try { UPDATE } catch { MERGE } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 13:13
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
bubuzu, А апдейт несуществующей строки не выдаст никаких ошибок, и в catch ловить будет нечего. Надо проверить, есть ли запись, если нет - сделать insert, и вот ошибку insert по duplicate key (в том маловероятном случае, если между проверкой и insert'ом такая запись успела появиться) ловить в catch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 13:27
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Кот МатроскинА апдейт несуществующей строки не выдаст никаких ошибок Он выдаст RowsAffected 0. Этого достаточно для проверки. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 13:48
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Dimitry Sibiryakov, При чем тут RowsAffected 0? Это событие поймает catch? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 14:25
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Кот МатроскинЭто событие поймает catch? Нет, но его поймает if. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 15:16
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Кот Матроскинbubuzu, А апдейт несуществующей строки не выдаст никаких ошибок, и в catch ловить будет нечего. Псевдокод всё на свете поймает. :) Кот МатроскинНадо проверить, есть ли запись, если нет - сделать insert, и вот ошибку insert по duplicate key (в том маловероятном случае, если между проверкой и insert'ом такая запись успела появиться) ловить в catch. А если я буду в read commited транзакции проверять наличие такой записи. Может выскочить эксцепшен с нарушением индекса ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
29.08.2013, 15:19
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
bubuzuА если я буду в read commited транзакции проверять наличие такой записи. Может выскочить эксцепшен с нарушением индекса ? Уровень изоляции транзакции тут абсолютно пофиг. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.09.2013, 09:21
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.09.2013, 09:39
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Old Nick Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. гигабайт разве здесь все равно через параметр не будет передан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.09.2013, 14:13
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Arm79, Параметры типа Blob передаются по ссылке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.09.2013, 14:40
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Old NickArm79, Параметры типа Blob передаются по ссылке. даже в случае внешнего приложения? Мне кажется, что нет. По ссылке - это работа внутри SQL сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.09.2013, 14:44
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Old NickArm79, Параметры типа Blob передаются по ссылке. С клиента, угу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 09:20
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Ну вы чего такие тяжелые? Не надо, не передавайте. Вопрос то не в этом. Я показал пример реализации для ТС. Просто выдрал скрипт из SVN. Дальше самостоятельно додумать сил нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 09:32
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Old NickНу вы чего такие тяжелые? Не надо, не передавайте. Вопрос то не в этом. Я показал пример реализации для ТС. Просто выдрал скрипт из SVN. Дальше самостоятельно додумать сил нет? Я к тому, что давать топикстартеру пример с неявными допущениями, учитывая его уровень, не стоит. У меня вот сил хватило, поэтому уточнил. ТС: все у вас правильно, нужно делать разными запросами, и не через ХП. Единственное, в вашем случае, я бы эти два запроса обернул в одну транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 13:49
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
bubuzuКак разруливаются такие ситуации. Основная задача в том, чтобы разрулить её атомарно - обеспечить невозможность ситуации "два процесса одновременно проверили отсутствие записи и оба начали вставлять по гигабайту". Здесь в первую очередь стоит понять, устроят ли нас подтяжки в виде завершения одного из них с ошибкой. Если да - от этого более или менее спасает уникальный индекс, но ГИГАБАЙТ будет прокачан напрасно. Если нет - надо делать что-то более сложное и, насколько я понимаю, постараться обеспечить возможность другим работать с таблицей, пока процесс качает на сервер ГИГАБАЙТ. В целом, первое, что приходит в голову - в случае отсутствия записи сначала вставлять её (без блоба), а потом модифицировать (качать гигабайт). Таким образом мы сразу вывесим надёжный флаг, а в код можем вставить проверку "если вставка свалилась, значит, кто-то другой успел вставить, поэтому идём на вариант модификации". Отдельное удовольствие Вы получите, если записи из таблицы могут удаляться. Тогда вполне реален вариант "exists вернул true, а вот update ушёл в молоко", с ним тоже надо возиться. В общем, всё немного сложнее, чем в примере старины Ника :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 13:56
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
softwarerв код можем вставить проверку "если вставка свалилась, значит, кто-то другой успел вставить, поэтому идём на вариант модификации". Который тоже "уйдёт в молоко", поскольку тот, кто "успел вставить" ещё не закоммитился. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 14:14
|
|||
|---|---|---|---|
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
Dimitry Sibiryakovsoftwarerв код можем вставить проверку "если вставка свалилась, значит, кто-то другой успел вставить, поэтому идём на вариант модификации". Который тоже "уйдёт в молоко", поскольку тот, кто "успел вставить" ещё не закоммитился. Дим, мне кажется, Вам стоит вспомнить, когда именно сваливается второй соискатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.09.2013, 14:38
|
|||
|---|---|---|---|
|
|||
IF EXISTS UPDATE ELSE INSERT |
|||
|
#18+
softwarerмне кажется, Вам стоит вспомнить, когда именно сваливается второй соискатель. Трудно вспомнить то, чего никогда не знал. Я не знаю когда в MS SQL свалится второй соискатель при каждом сочетании уровней изоляции их транзакций и прочих настроек. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=32&tablet=1&tid=1541134]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 278ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...