2012-03-22 2 views
2

Я хочу сделать что-то вроде этого:PostgreSQL - транзакции обеспечивают атомарность?

SELECT * FROM TABLE where *condition* 
... TEST for a row being returned 
IF NOT 
    INSERT the row 

Другими словами, я только хочу, чтобы вставить строку в таблицу, если она еще не существует. Меня беспокоит то, что пока я тестирую результирующий набор, на самом деле строка может быть вставлена ​​другим процессом. Я не знаю этого, и две строки будут вставлены. Я не хочу, чтобы это произошло.

Я думал об упаковке двух операторов в транзакции, но я подозреваю, что это не ответ; Я не знаю, имеют ли транзакции эффект, подобный блокировке таблицы во время их выполнения, тем самым предотвращая любые другие вставки между моими SELECT и INSERT? Это вопрос.

Я подозреваю, что лучший способ сделать это - просто установить уникальный ключ по столбцам в строке и тем самым предотвратить дублирование вставок. Но мне все еще интересно, действительно ли моя идея об использовании транзакций действительна или дико отключена?

ответ

5

База данных обеспечит атомарность. Но это вам не поможет, потому что атомизм не означает, что вы думаете. Он просто говорит, что БД либо выполнит набор операций полностью, либо вообще не будет.

Это причина, почему DB люди всегда говорят о ACID что означает:

  • Атомарности
  • Консистенция
  • изоляция
  • Прочность

Вы должны прочитать связанную Википедия статью, а также главу Transaction Isolation в руководстве PostgreSQL, в котором ch также объясняет все это в контексте PostgreSQL.

О, вам в основном нужен ACI в вашем случае. И если вы не хотите использовать уникальный индекс, вам нужно будет сделать блокировку таблицы на полную таблицу перед вставкой. Таким образом, индекс является самым простым и надежным решением.

Смежные вопросы