Ручное управление транзакциями в DBD::Pg
Мне трудно заставить ручные транзакции работать, как описано в DBD::Pg, или я просто неправильно понимаю указанную документацию.
Насколько я понимаю, если я хочу вручную управлять транзакциями, я должен отключить AutoCommit.
$dbh->{AutoCommit} = 0;
$dbh->begin_work;
Но когда я делаю это, я получаю постоянные ошибки
DBD::Pg::db begin_work failed: Already in a transaction
Чтобы это работало, мне нужно сначала включить AutoCommit.
$dbh->{AutoCommit} = 1;
$dbh->begin_work;
Но это, похоже, не согласуется ни с одной документацией.
Я просто неправильно это понимаю?
2 ответа
Насколько я понимаю, если я хочу вручную управлять транзакциями, я должен отключить AutoCommit.
Нет, совсем наоборот. настройка AutoCommit
в 0
начинает транзакцию, поэтому вы хотите установить ее 1
, Чтобы ваши изменения были зафиксированы автоматически, это означает, что база данных не использует транзакции, а это именно то, что вам нужно.
Насколько я понимаю, если я хочу вручную управлять транзакциями, я должен отключить AutoCommit.
Правильный.
Однако DBD::Pg автоматически запускает ваши транзакции для вас. Вы не можете начать транзакции вручную. Лучший вариант - отключить автокоммит, а затем просто выполнить:
$dbh->commit;
когда вы готовы совершить. Это позволит одновременно зафиксировать существующую транзакцию и начать новую транзакцию.
Теперь, если вы включите autocommit, то все, что существует вне транзакции, становится его собственной транзакцией, по одной транзакции на оператор. Если вы хотите быть уверены в ручном управлении транзакциями, вы должны отключить его.