JPA условная вставка / изоляция транзакций РСУБД? - PullRequest
3 голосов
/ 24 января 2012

Я хочу вставить запись в таблицу RDBMS, только если таблица не состоит из каких-либо строк, которые «похожи» (в соответствии с некоторыми конкретными, нерелевантными критериями) на указанную строку. У меня есть простой запрос SELECT для проверки, существуют ли «похожие» строки.

Изначально я полагал, что для достижения моей цели достаточно будет условно выполнить запрос SELECT, а затем запрос INSERT, оба вместе в одной транзакции. Тем не менее, я читал о разных уровнях изоляции, и кажется, что в параллельной среде два потока могут одновременно выполнять оператор SELECT и заканчивать тем, что обе вставляют «похожие» строки в таблицу, даже если SELECT + INSERT в той же транзакции.

Первый вопрос: я использую JPA (поверх Hibernate) и базу данных MySQL (использую движок InnoDB для всех моих таблиц). Каков наилучший способ достижения моей цели? Я бы, очевидно, предпочел остаться стандартным, но при необходимости готов перейти на родной язык.

Второй вопрос: если я не возражаю против «переопределения» записей «похожими» записями, и я заменяю инструкцию SELECT на DELETE - будет ли она работать так, как я намеревался тогда? По сути, я спрашиваю здесь, является ли DELETE + INSERT в одной транзакции атомарным, в том смысле, что если два потока запускают их одновременно, то независимо от того, как они выполняются, таблица никогда не будет состоять из обеих вставленных записей после двух транзакции завершены (с одной стороны, я был бы очень удивлен, если бы это не было атомарным в этом смысле, но с другой, кажется, что это вызывает блокировку таблицы, не так ли?).

Спасибо за вашу помощь!

...