Наше приложение считывает запись из таблицы «Событие» Oracle. Когда существует запись событий, мы обновляем поле «count» этой записи. Если запись не существует, мы ее вставляем. Поэтому мы хотим только 1 запись для определенного события в таблице.Последовательные потоки приложений и незафиксированные данные в Oracle
Проблема с этим, вероятно, вполне предсказуема: один поток приложений будет читать таблицу, увидеть, что события там нет, вставить новое событие и зафиксировать. Но прежде чем он совершит второй поток, он также прочитает таблицу и увидит, что события там нет. И тогда оба потока вставляют событие, и в итоге мы получим 2 записи для одного и того же события.
Я предполагаю, что синхронизация доступа к этому конкретному методу в нашем приложении предотвратит эту проблему, но что является лучшим вариантом в Oracle, чтобы предотвратить это? Будет ли MERGE, например, всегда предотвращать эту проблему?
Merge обеспечит его, и для меня это было бы предпочтительным решением. Обеспечение его в приложении позволит сохранить его только для приложения (а не для других приложений, способных генерировать одни и те же события), но это будет определенно больше кода, менее безопасным и медленным. – Husqvik
Merge не будет защищать его, так как он работает с точно такой же моделью согласованности чтения, как и любая другая инструкция SQL, и в любом случае это не атомная операция. –
@ Husqvik и David - это два диаметрально противоположных ответа :-) На самом деле, я полагаю, Дэвид прав, говоря, что проблема все равно будет существовать, потому что даже используя MERGE, второй запрос MERGE не увидит незафиксированное изменение первого MERGE (aka read_committed), правильно? – Julius