она есть, либо вставить новую с какими-то значениями по умолчанию, если ее еще нет. удалений нет и не будет, конкуренция - теоретически возможно.
какие там последние достижения разработческой мысли на этот счет? merge всё так же не атомарен? писать по старинке insert/except dup_val_on_index/update? заранее наполнять таблицу пакетно, чтобы потом работал только update?
Частота операций какая и объемы данных? Это к тому надо ли заполнять все заранее
пока всё смешное. со временем вырастет в несколько раз, но всё еще будет смешное. в принципе, insert/dup_val_on_index/update логически полностью устраивает, просто думаю, придумали ли что лучше.
В смысле не атомарен? У него, конечно, есть некоторые проблемы, например, с триггерами, но он всегда был атомарен.
А расскажите какие там с триггерами проблемы
Двойной вызов строчных на insert/update/delete
ок. неверно выразился. в том смысле, что либо выполняется целиком, либо не выполняется целиком - конечно он атомарен.
В чем именно претензия к мерджу? Разве, не любой DML так себя ведёт - выполняется только целиком?
любой. про атомарность, повторюсь, я сказал глупость. вероятно в том что он не увидит вставки из конкурентной сессии и отвалится с ora-1. дома напишу тест, проверю.
Спасибо! Будет интересно
да ничего там интересного скорее всего не будет. два одинаковых merge в разных сессиях в пустую таблицу. первый вставит, второй повиснет на блокировке. если первый зафиксирует, то второй отвалится с ора-1. наверное.
Или скорее рестартанет и проапдейтит
не, ORA-1 выходит
insert ведёт себя точно также. Я так и не понял в чём была претензия к merge и почему вместо него надо писать insert/update
претензия, видимо, в том, что это не очевидно, что merge может выдать такую ошибку :)
insert /*+ ignore_row_on_dupkey_index()*/ into вставит недублирующие записи merge упадёт если есть хотя бы один дубль
а с таким хитрым хинтом ошибок не будет и оно просто их проигнорит?
А, да, туплю - логично же с точки зрения acid так и должно быть: на момент старта стейтмента строки не существует, поэтому идёт вставка, а не апдейт
в том что merge в описанном примере выбрасывает ора-1, а не выполняет апдейт. что, если задуматься о том, как работать мердж, логично и ожидаемо, но мне от этого не легче 🤣 ну и вообще он, вероятно, не был предназначен для построчных апсертов
Обсуждают сегодня