При работе с функцией Postgres где нужно делать транзакцию и как правильно?
Есть какая-то функция в Postges, которая из разных таблиц должна удалить данные. Естественно в результате работы может что-то пойти не так.
- Правильно ли я понимаю, что в Postges внутри функции нельзя открывать транзакции и коммитить/откатывать?
- Правильно ли я понимаю, что в транзакцию надо помещать вызов этой самой функции из кода PHP?
- Когда в PHP открываю и закрываю транзакцию, то по сути драйвер БД "говорит" самой БД эту команду (BEGIN) исполнить, так?
Ответы (1 шт):
в Postges внутри функции нельзя открывать транзакции и коммитить/откатывать?
Да, функция выполняется строго в транзакции и не может управлять внешней транзакцией.
Процедура управлять транзакцией может. Поддержка процедур (create procedure и вызов через call, соответственно) была добавлена в postgresql 11.
в транзакцию надо помещать вызов этой самой функции из кода PHP?
На усмотрение автора кода.
Вызов хранимой функции в любом случае будет внутри транзакции, явно выполненной приложением либо неявно открытой только на этот sql запрос с вызовом функции. PostgreSQL строго транзакционная база, у вас нет опции "запустить запрос вне транзакции", запрос будет в транзакции всегда, даже если вы об этом явно не просили.
Когда в PHP открываю и закрываю транзакцию, то по сути драйвер БД "говорит" самой БД эту команду (BEGIN) исполнить, так?