Ручное управление транзакциями в 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, то все, что существует вне транзакции, становится его собственной транзакцией, по одной транзакции на оператор. Если вы хотите быть уверены в ручном управлении транзакциями, вы должны отключить его.

Другие вопросы по тегам