powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакция на PL/pgSQL
9 сообщений из 9, страница 1 из 1
Транзакция на PL/pgSQL
    #40040429
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040435
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wasteland Rebel
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.

begin;
...
commit;
profit.
А при чем тут PL/pgSQL?
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040440
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mefman
Wasteland Rebel
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.

begin;
...
commit;
profit.
А при чем тут PL/pgSQL?

Я читал, что PostgreSQL не откатит изменения, если хоть в одном statement выше произойдет ошибка в блоке begin->commit без rollback. Т.е. он выполнит то, что может выполнить. И подумал, что здесь нужно что-то более сложное с применение pl/pgsql.
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040443
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наоборот - откатит все, если хоть в одном ошибка. В этом и суть транзакции.
функция (plpgsql) - всегда транзакция, насколько я помню.

зы: DELETE FROM, в данном случае, можно (нужно) заменить на TRUNCATE.
А для читаемости лучше так писать:
Код: sql
1.
2.
3.
4.
TRUNCATE web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040447
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78,

Попробовал с BEGIN ... COMMIT.
Если происходит ошибка, то вроде как действительно ничего не применяется. Но если ошибок не возникает, точнее не должны (так как не возникали без блока begin...commit), то получаю ошибку:
Код: sql
1.
2.
3.
4.
ERROR:  ОШИБКА:  текущая транзакция прервана, команды до конца блока транзакции игнорируются


SQL state: 25P02
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040450
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит есть ошибка
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040458
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78
значит есть ошибка

Да, мой косяк был.
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040464
Wasteland Rebel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tip78,
Кстати, почему TRUNCATE предпочтительнее?
...
Рейтинг: 0 / 0
Транзакция на PL/pgSQL
    #40040615
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому быстрее и менее ресурсоёмок
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакция на PL/pgSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]