LINUX.ORG.RU

[PostgreSQL] Триггеры и INSERT

 


0

1

Вопрос вот в чём: может ли между срабатыванием триггера на вставку данных в таблицу и вставкой данных в таблицу произойти вставка в другою таблицу в параллельной транзакции?

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

★★

От уровня изолированности транзакции зависит. В общем, может. Но можно сделать и так, чтобы это было недопустимо.

tanenn
()
Ответ на: комментарий от SaBo

Ну во-первых begin/commit, во-вторых set transaction isolation level. Еще про многоверсионный контрольно-измерительный параллелизм надо почитать, тут уже не помню как оно работает. Ну и например, set transaction isolation level serializable; В при таком значении уровня, находясь внутри транзакции пользователь не будет замечать изменений, которые внесли в базу данных другие пользователи.

tanenn
()
Ответ на: комментарий от SaBo

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

tanenn
()
Ответ на: комментарий от SaBo

Стоп, я тормоз :)
Занёс необходимые данные в одну таблицу и поставил уник :)

В таком случае, насколько я понимаю, и в режиме READ COMMITTED одинаковых записей не получиться?

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

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

tanenn
()
Ответ на: комментарий от tanenn

Если на таблице уник, то только уники туда и можно записать, чтобы там ни было)


Во, спасибо ))
Проблема была в неправильной проектировке :)

SaBo ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.