INSERT и сериализация транзакций в PostreSQL - PullRequest
3 голосов
/ 10 июня 2010

У меня есть вопрос. Уровень изоляции транзакции установлен на сериализуемый. Когда один пользователь открывает транзакцию и ВСТАВЛЯЕТ или ОБНОВЛЯЕТ данные в «table1», а затем другой пользователь открывает транзакцию и пытается ВСТАВИТЬ данные в ту же таблицу, нужно ли второму пользователю ждать, пока первый пользователь совершит транзакцию?

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

Как правило, нет.Вторая транзакция только для вставки, поэтому, если не требуется проверка уникального индекса или другой триггер, данные могут быть вставлены безоговорочно.В случае уникального индекса (включая первичный ключ) он будет блокироваться, если обе транзакции обновляют строки с одинаковым значением, например:

-- Session 1                           -- Session 2
CREATE TABLE t (x INT PRIMARY KEY);
BEGIN;
INSERT INTO t VALUES (1);
                                       BEGIN;
                                       INSERT INTO t VALUES (1);  -- blocks here
COMMIT;
                                       -- finally completes with duplicate key error

В случае обновлений вещи менее очевидны, что может повлиять навставки по другой транзакции.Я понимаю, что PostgreSQL еще не поддерживает «истинную» сериализуемость в этом случае.Я не знаю, насколько часто это поддерживается другими системами SQL.

См. http://www.postgresql.org/docs/current/interactive/mvcc.html

0 голосов
/ 10 июня 2010

Второй пользователь будет заблокирован до тех пор, пока первый пользователь не подтвердит или не отменит свои изменения.

...