PostgreSQL - обеспечивают ли транзакции атомарность? - PullRequest
2 голосов
/ 23 марта 2012

Я хочу сделать что-то вроде этого:

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

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

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

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

1 Ответ

5 голосов
/ 23 марта 2012

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

Именно по этой причине сотрудники БД всегда говорят о ACID , что означает:

  • Атомность
  • Согласованность
  • Изоляция
  • Долговечность

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

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

...