При работе с функцией Postgres где нужно делать транзакцию и как правильно?

Есть какая-то функция в Postges, которая из разных таблиц должна удалить данные. Естественно в результате работы может что-то пойти не так.

  • Правильно ли я понимаю, что в Postges внутри функции нельзя открывать транзакции и коммитить/откатывать?
  • Правильно ли я понимаю, что в транзакцию надо помещать вызов этой самой функции из кода PHP?
  • Когда в PHP открываю и закрываю транзакцию, то по сути драйвер БД "говорит" самой БД эту команду (BEGIN) исполнить, так?

Ответы (1 шт):

Автор решения: Мелкий

в Postges внутри функции нельзя открывать транзакции и коммитить/откатывать?

Да, функция выполняется строго в транзакции и не может управлять внешней транзакцией.

Процедура управлять транзакцией может. Поддержка процедур (create procedure и вызов через call, соответственно) была добавлена в postgresql 11.

в транзакцию надо помещать вызов этой самой функции из кода PHP?

На усмотрение автора кода.

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

Когда в PHP открываю и закрываю транзакцию, то по сути драйвер БД "говорит" самой БД эту команду (BEGIN) исполнить, так?

Да, верно.

→ Ссылка